有没有写过Koa中间件,说下中间件原理,介绍下自己写过的中间件
Posted 进阶全栈开发
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有没有写过Koa中间件,说下中间件原理,介绍下自己写过的中间件相关的知识,希望对你有一定的参考价值。
一、中间件简介
// async 函数
app.use(async (ctx, next) => {
const start = Date.now();
await next();
const ms = Date.now() - start;
console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
});
// 普通函数
app.use((ctx, next) => {
const start = Date.now();
return next().then(() => {
const ms = Date.now() - start;
console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
});
});
中间件可以通过官方维护的仓库查找获取,也可以根据需求编写属于自己的中间件。
二、中间件原理
2.1简单示例
const Koa = require("Koa");
const app = new Koa();
// 最外层的中间件
app.use(async (ctx, next) => {
await console.log(`第 1 个执行`);
await next();
await console.log(`第 8 个执行`);
});
// 第二层中间件
app.use(async (ctx, next) => {
await console.log(`第 2 个执行`);
await console.log(`第 3 个执行`);
await next();
await console.log(`第 6 个执行`);
await console.log(`第 7 个执行`);
});
// 最里层的中间件
app.use(async (ctx, next) => {
await console.log(`第 4 个执行`);
ctx.body = "Hello world.";
await console.log(`第 5 个执行`);
});
2.2原理
三、编写自己的中间件
3.1 token验证的中间件
// middleware/token.js
module.exports = options => async (ctx,next){
try{
const token = ctx.header.authorization;
if(token){
// verify 函数验证token,并获取相关信息
await verify(token)
}
await next();
}catch (err){
console.log(err);
}
}
// app.js
const Koa = require("koa");
const app = new Koa();
const token = require("./middleware/token");
app.use(token());
app.listen(3000, () => {
console.log("server is running at http://localhost:3000");
});
3.2 log 的中间件
// middleware/logger.js
const fs = require('fs');
module.exports = (options) => async (ctx,next){
const startTime = Date.now();
const requestTime = new Date();
await next();
const ms = Date.now - startTime;
let logout = `${ctx.request.ip}--${requestTime}--${ctx.method}--${ctx.url}--${ms}ms`;
// 输出日志文件
fs.appendFileSync('./log.txt',logout + '\n');
}
// app.js
const Koa = require("koa");
const app = new Koa();
const logger = require("./middleware/logger");
app.use(logger());
app.listen(3000, () => {
console.log("server is running at http://localhost:3000");
});
有个log4js的库非常不错,可以结合log4js等包来记录更详细的日志。
以上是关于有没有写过Koa中间件,说下中间件原理,介绍下自己写过的中间件的主要内容,如果未能解决你的问题,请参考以下文章