注:原文地址在我的博客issue里https://github.com/ChenShenhai/blog/issues/15
generator中间件返回的应该是function * () 函数
/* ./middleware/logger-generator.js */function log( ctx ) {console.log( ctx.method, ctx.header.host + ctx.url )}module.exports = function () {return function * ( next ) {// 执行中间件的操作log( this )if ( next ) {yield next}}}
generator 中间件在koa v1中可以直接use使用
const koa = require('koa') // koa v1const loggerGenerator = require('./middleware/logger-generator')const app = koa()app.use(loggerGenerator())app.use(function *( ) {this.body = 'hello world!'})app.listen(3000)console.log('the server is starting at port 3000')
generator 中间件在koa v2中需要用koa-convert封装一下才能使用
const Koa = require('koa') // koa v2const convert = require('koa-convert')const loggerGenerator = require('./middleware/logger-generator')const app = new Koa()app.use(convert(loggerGenerator()))app.use(( ctx ) => {ctx.body = 'hello world!'})app.listen(3000)console.log('the server is starting at port 3000')
/* ./middleware/logger-async.js */function log( ctx ) {console.log( ctx.method, ctx.header.host + ctx.url )}module.exports = function () {return async function ( ctx, next ) {log(ctx);await next()}}
async 中间件只能在 koa v2中使用
const Koa = require('koa') // koa v2const loggerAsync = require('./middleware/logger-async')const app = new Koa()app.use(loggerAsync())app.use(( ctx ) => {ctx.body = 'hello world!'})app.listen(3000)console.log('the server is starting at port 3000')