我转过几个弯 绕过那个小雨楼
拿着蒲扇摆着衣衫渡着紧箍咒
不问天涯不停留 喝过几壶酒
不过年少白头道义放胸口
倘若明天之后 遥看前尘剑封侯
似那天上神仙无所求
朝朝暮暮君如梦醒十分不为何理由
是真是假是惶恐是无休
路过这风雨花满楼 片刻都不停留
我本这书生进京赶考留下许多愁
你问有没有时候 我叹这天道默悠悠
能否与我一醉方休
又过了几个弯 算尽天量道莫慌
踏这田园闻这芳草香
跌跌撞撞仗剑天涯折煞不枉无笔良
是梦是幻是温柔是家乡
路过这风雨花满楼 片刻都不停留
我本这书生进京赶考留下许多愁
你问有没有时候 我叹这天道默悠悠
能否与我一醉方休
路过这风雨花满楼 片刻都不停留
我本这书生进京赶考留下许多愁
你问有没有时候 我叹这天道默悠悠
能否与我一醉方休
谁能与我一醉方休
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这个读取文件的函数里面。
评论(0)