开始看到koa的时候感觉有点像.netcore的风格,定义中间件的的思维,其实有点像在一个请求的路上设置各种过滤器一样的操作,就是请求经过我这里我想处理就处理,如果不处理就传给下一个中间件的,一些相关的WEB服务器相关的功能都可以在中间件去实现。
自定义中间件主要的是定义一个方法用来做中间件。我们这里定义一个myMiddleWare.js文件。
const myMiddleWare = async(ctx,next) => {
ctx.body = "這是一個中間件測試";
await next();
}
module.exports = {
myMiddleWare
}
其实myMiddleWare中一个方法,这个方法带有两个参数ctx和next,这两个参数是固定的,第一个代表的是请求的一些上下文环境参数,如request,response等都是这个参数,有点类似于java中的Context之类的东西,也就是封装了一些请求的对象。next是一个方法用于执行下一步操作,也就是调用下一次中间件意思。最后混使用module.exports来导出模块中的文法myMiddleWare,这样就能在外部引用了。
const Koa = require('koa') // 引入koa
const router = require('./router/router')
const bodyparser = require('koa-bodyparser')
const { myMiddleWare } = require('./middleware/myMiddleWare')
const app = new Koa() // 声明实例
app.use(myMiddleWare);
app.use(bodyparser({
enableTypes: ['json', 'form', 'text'],
multipart: true // 是否支持 multipart-formdate 的表单
}));
//console.dir(router);
/**
* router.routes() 启动路由
* router.allowedMethods() 运行任何请求——get/post/put/delete等
*/
app.use(router.routes(), router.allowedMethods());
app.listen(3000)
console.log("nodejs start");
这里我们不用去关心其它的部分,我们只用关心以下这两行代码,这里我们要注意的就是{ myMiddleWare }中的myMiddleWare不能随便命名了,必须要和js文件中的导出名称一样,这里不是变量,正确的理解应是使用那个导出函数,因此这里必须为myMiddleWare。
const { myMiddleWare } = require('./middleware/myMiddleWare')
app.use(myMiddleWare);
那我们改一下行不行呢,我把myMiddleWare.js中的内容改成这样。
const myMiddleWare = async(ctx,next) => {
ctx.body = "這是一個中間件測試";
await next();
}
module.exports = myMiddleWare
这样我们导出的就是一个方法了,现在我们就可以不用名称相同了,因为myMiddle只是一个变量。
const myMiddle = require('./middleware/myMiddleWare')
app.use(myMiddle);
在测试中发现和我们如果在next()之前有输出ctx.body='xxx‘的话,如果后面还有中间件输出,这时会用后面的替代前面的输出。