koa框架10 koa-router和错误处理
用于处理不同的地址,执行不同的函数或调用不同的模块
安装
npm i koa-router
基本使用
const Koa = require("koa");
const Router = require("koa-router");
const server = new Koa();
server.listen(8080);
//创建路由
const router = new Router();
router.get("/", async ctx => {
ctx.body = "get请求";
});
router.post("/", async ctx => {
ctx.body = "post请求";
});
server.use(router.routes());
router和koa一样,也是一个构造函数,new出来后,给这个对象配置请求,然后对应的回调函数。
路由配置好后我们需要他作为中间件被server对象使用,使用use并且router使用routes方法。
这样一个基本使用就完成了,用户使用get和post请求根目录会有内容返回。
错误处理
既然路由有了,我们怎么处理下用户请求时出现的错误。
错误一般有两种,要么就是没有这个内容,要么就是服务器出错,所以一个是404,一个是500
//创建路由
const router = new Router();
//错误处理
server.use(async (ctx, next) => {
try {
await next();
if (!ctx.body) {
ctx.status = 404;
ctx.body = "404";
}
} catch (err) {
ctx.status = 500;
ctx.body = "500";
console.log(err);
}
});
错误处理一般放在最上层,因为next可以理解为是下面所有要运行的函数集合,那么我们用try--catch去捕获这个next运行时的错误,是不是就可以判断,代码里面报错了,这个报错就是服务器的问题了,我们返回500
404的话,我们就判断ctx的body属性有没有内容,如果没有内容,那就说明找不到,或者路由里面根本没有对应的请求地址配置,那就更不可能有东西了,所以我们返回404
由于body返回的只是要显示的内容,我们还需要设置状态码,也就是ctx的status属性
注意status的值必须要是数字类型
返回错误网页
刚刚返回的都是文本信息,我们可以返回网页,让错误页面更加好看一些。
const Koa = require("koa");
const Router = require("koa-router");
const fs = require("promise-fs");
const server = new Koa();
server.listen(8080);
//创建路由
const router = new Router();
//错误处理
let err = {};
(async () => {
//404
const e404 = await fs.readFile("./error/404.html")
err["404"] = e404.toString();
//500
const e500 = await fs.readFile("./error/500.html");
err["500"] = e500.toString();
})();
//错误页面返回
server.use(async (ctx, next) => {
try {
await next();
if (!ctx.body) {
ctx.status = 404;
ctx.body = err["404"];
}
} catch (err) {
ctx.status = 500;
ctx.body = err["500"];
console.log(err);
}
});
router.get("/", async ctx => {
// ctx.body = "get请求";
ctx.body = sesda.adasdaaad;
});
router.post("/", async ctx => {
ctx.body = "post请求";
})
server.use(router.routes());
这里我们用了promise-fs
插件,他将文件读取改为了异步,在为了不每次发生错误时读取一次文档,我们先将文件读取好存储在变量里面,也就是内存中,当发生错误时,直接调用。
我们将读取文件改为了一个自运行的async函数,由于fs是一个promise,所以我们不能直接在后面接一个toString方法,而是存储在一个变量里,再使用toString。
为什么要使用toSring,因为fs读取的文件内容,他是一个二进制的内容,他不是我们能看懂的,如果要让浏览器渲染,你需要将它转为字符。
由于err是统一的外部对象,所以我们没必要把所有的路由啊哪些都写在async这个读取文件的函数里面。
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿站点。未经许可,禁止转载。
暂无评论数据