东莞市盛裕绒艺玩具有限公司

东莞市盛裕绒艺玩具有限公司

sungame官网手机版

13953174431
联系方式
全国服务热线: 13953174431

咨询热线:15378897979
联系人:武宝林
地址:海南省海口市 省市新华区海秀东路17号

在koa中想要优雅的发送响应?看这就对了

来源:sungame官网手机版   发布时间:2019-06-24   点击量:28

背景

前不久把项目中用了很久的一个伪中间件撸成了一个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地址 Github传送门 个人博客传送门 javascript  ["dʒɑ:və,skrɪpt]  详细X基本翻译n. 基于对象和事件驱动的客户端脚本语言网络释义JavaScript: JavaScriptJavaScript engine: JavaScript引擎JavaScript API: 扩展 detectiveHLH 详细X  没有英汉互译结果  请尝试网页搜索 , 1, 0, 9);

相关产品

COPYRIGHTS©2017 sungame官网手机版 ALL RIGHTS RESERVED 备案号:28