用于处理不同的地址,执行不同的函数或调用不同的模块

安装

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这个读取文件的函数里面。

分类: Node 标签: nodekoakoa-router404500

评论

暂无评论数据

暂无评论数据

目录