背景
前不久把项目中用了良久的一个伪中间件撸成了一个npm包宣布了出去。
为何叫伪中间件?一般的中间件的援用体式格局, 就拿body-parser为例。
var Koa = require('koa');
var bodyParser = require('koa-bodyparser');
var app = new Koa();
app.use(bodyParser());
app.use(async ctx => {
// the parsed body will store in ctx.request.body
// if nothing was parsed, body will be an empty object {}
ctx.body = ctx.request.body;
});
反观我撸的伪中间件的援用体式格局。
const response = require('../uitls/Response');
const data = {};
response.success(ctx, data);
为何要这么干呢…地道是由于这个伪中间件与现有项目的耦合度太高了,为(就)了(是)方(懒)便在项目内里把这个伪中间件的援用体式格局从当地东西组件换成从node_modules里援用。比方如许。
const response = require('koa2-response');
const data = {};
response.success(ctx, data);
经由一番折腾,项目中的援用体式格局悉数替代完了。然后我的学弟就看不下去了。。。提了一个pullrequest给我。把这个实在封装成了一个中间件。
优化
首先是改变了援用体式格局,之前的体式格局是直接导出了一个对象,这个对象有两个要领,分别是success和error。运用这类体式格局,就必须要在每一个controller中都援用一次,以下。
const response = require('../utils/Response');
优化以后,只须要在node的进口文件中做以下操纵就好
const koa = require('koa');
const app = new koa();
const router = require('koa-router')();
const response = require('koa2-response');
const code = {
UNKNOWN_ERROR: [1, 'Sorry, you seem to have encountered some unknown errors.']
}
router
.get('/', (ctx, next) => {
ctx.success({
name: 'test'
})
})
.get('/error_test', (ctx, next) => {
ctx.error(code.UNKNOWN_ERROR);
})
app.use(router.routes());
app.use(router.allowedMethods());
app.listen(3000);
console.log(`Server is running on port 3000`);
对照两种体式格局可能有有些疑问,第一种体式格局,须要传入ctx,而改进以后的体式格局没有了ctx。那是由于在中间件中做了以下处置惩罚。
const { success, error } = require('./util');
module.exports = async (ctx, next) => {
ctx.success = success.bind(null, ctx);
ctx.error = error.bind(null, ctx);
await next();
}
如许一来,koa的上下文ctx就会被看成ctx.success的默许第一个参数。针对差别模块的controller,不须要再去零丁援用一次依靠包,能够直接经由过程ctx对中间件举行挪用。相关于最初的版本,如许大大的提高了开辟的效力。
写在背面
关于这个,照样有些挂念。假如koa以后更新的时刻,也涌现了success和error的要领,再引入这个包,就会覆蓋掉koa要领。
不知道会不会带来什么问题。
Pull request地点 异常皮的pull request地点
Github传送门 koa2-response
个人博客传送门 detectiveHLH