背??景前不久,项目中用了很久的一个伪中间件被打成npm包发布了。为什么叫伪中间件呢?正常的中间件引用,以body-parser为例。varKoa=require('koa');varbodyParser=require('koa-bodyparser');varapp=newKoa();app.use(bodyParser());app.use(asyncctx=>{//解析后的主体将存储在ctx.request.body//如果没有解析,主体将是一个空对象{}ctx.body=ctx.request.body;});constresponse=require('../uitls/Response');constdata={};response.success(ctx,data);为什么要这样做...纯粹是因为这个伪中间件兼容现有的projects耦合度太高,所以(刚)(是)方(懒)把这个伪中间件的引用方式从本地工具组件改成从项目中的node_modules引用。例如像这样。constresponse=require('koa2-response');constdata={};response.success(ctx,data);经过一番折腾,项目中所有的引用方法都被替换掉了。然后我师弟就受不了了。..向我提到了一个拉取请求。这个其实是封装成了一个中间件。第一个优化是改变引用方法。以前的方法是直接导出一个对象。这个对象有两个方法,分别是success和error。这样在每个controller中都要引用一次,如下。constresponse=require('../utils/Response');优化后,只需要在节点的入口文件中做如下内容constkoa=require('koa');constapp=newkoa();constrouter=require('koa-router')();constresponse=require('koa2-response');constcode={UNKNOWN_ERROR:[1,'抱歉,您似乎遇到了一些未知错误。']}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(`Serverisrunningonport3000`);对比这两个方法可能会有一些疑惑。第一种方法需要传入ctx,改进后的方法没有ctx。那是因为下面的处理是在中间件中完成的。const{成功,错误}=require('./util');module.exports=async(ctx,next)=>{ctx.success=success.bind(null,ctx);ctx.error=error.bind(null,ctx);awaitnext();}这样,koa上下文ctx就会作为ctx.success的默认第一个参数。对于不同模块的controller,无需单独引用依赖包,直接通过ctx调用中间件即可。与原始版本相比,这大大提高了开发效率。写到后面,对此我还是有些顾虑的。如果后面更新koa,success和error方法也会出现,如果再引入这个包,koa方法会被覆盖。我不知道它是否会导致任何问题。pullrequest地址很瘦的pullrequest地址github传送门koa2-response个人博客传送门detectiveHLH
