中间件

ThinkKoa框架默认加载了static、payload、router、controller等常用的中间件,能够满足大部分的Web应用场景。用户也可以自行增加中间件进行扩展。

创建中间件

使用命令行工具thinkkoa_cli,在命令行执行命令:

//custom 为自定义中间件名
think middleware custom

会自动在项目目录生成文件 app/middleware/custom.js

中间件也可以进行多模块模式划分(非必须):

think middleware admin/user

会自动在项目目录生成文件 app/middleware/admin/user.js

生成的中间件代码模板:


/**
 * Middleware
 * @return
 */

module.exports = function (options, app) {
    return function (ctx, next) {
        return next();
    }
};
  • options 中间件配置,src/config/middleware.js内config项中间件名同名属性值
  • app thinkkoa实例
  • ctx koa ctx上下文对象
  • next 下一中间件操作句柄

配置中间件

写好自定义的中间件以后,开始定义配置并挂载运行:

修改项目中间件配置 app/config/middleware.js

list: ['custom'], //加载的中间件列表
config: { //中间件配置 
    custom: {
        //中间件配置项
    }
}

多模块模式中间件配置:

list: ['admin/user'], //加载的中间件列表
config: { //中间件配置 
    'admin/user': {
        //中间件配置项
    }
}

单次执行

中间件的执行机制为只要挂载运行,每次request/response都会执行该中间件。

在项目开发中,往往某个功能仅需要运行一次即可,并不需要每次都执行。例如功能拓展,初始化赋值等等。

那么我们可以按照下面方式注入到启动事件队列内运行:

app/middleware/custom.js

/**
 * Middleware
 * @return
 */

module.exports = function (options, app) {
    app.once('appReady', () => {
        //仅需要单次执行的代码
    });
    return function (ctx, next) {
        return next();
    }
};

使用koa中间件

ThinkKoa支持使用koa的中间件(包括koa1.x及2.x的中间件):

app/middleware/passport.js

module.exports = require('koa-passport');

挂载并配置使用:

app/config/middleware.js

list: ['passport'], //加载的中间件列表
config: { //中间件配置 
    'passport': {
        //中间件配置项
    }
}

使用express中间件

ThinkKoa支持使用express的中间件:

app/middleware/passport.js

const passport =  require('express-passport');
module.exports = function (options, app) {
    return app.parseExp(passport);
};

注意:

express中间件数量众多,无法一一覆盖测试。而且大部分在koa内有对应的中间件。因此建议自行修改实现,尽量不要直接引用。

ctx上下文

见文档章节API/ctx