在koa中想要优雅的发送响应?看这就对了
背景
前不久把项目中用了很久的一个伪中间件撸成了一个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传送门 个人博客传送门
在koa中想要优雅的发送响应?看这就对了的更多相关文章
- 从前端中的IOC理念理解koa中的app.use()
忙里偷闲,打开平时关注的前端相关的网站,浏览最近最新的前端动态.佼佼者,平凡的我做不到,但还是要争取不做落后者. 前端中的IoC理念,看到这个标题就被吸引了.IoC 理念,不认识呢,点击去一看,果然没 ...
- Koa 中实现 chunked 数据传输
有关于 Transfer-Encoding:chunked 类型的响应,参见之前的文章HTTP 响应的分块传输.这里看 Koa 中如何实现. Koa 中请求返回的处理 虽然官方文档有描述说明不建议直接 ...
- (转)electron主线程中通过mainWindow.webContents.send发送事件,渲染线程接收不到
转自 https://segmentfault.com/q/1010000015599245/ 准备实现的功能: 页面1(渲染进程1)中点击按钮,发送事件给到主进程.主进程成功接收事件后,通过main ...
- Sharepoint2013 中想要将网站另存为模板步骤
Sharepoint2013 中想要将网站另存为模板步骤 第一步:使用SPD打开想要另存为模板的网站,找到网站选项: 第二步:点击打开网站选项,找到一个SaveSiteAsTemplateEnable ...
- Koa与Node.js开发实战(3)——Nunjucks模板在Koa中的应用(视频演示)
技术架构: 在Koa中应用Nunjucks,需要先把Nunjucks集成为符合Koa规格的中间件(Middleware),从本质上来讲,集成后的中间件的作用是给上下文对象绑定一个render(vi ...
- Koa 中 ejs 模板的使用
ejs的基本使用 安装 koa-views 和 ejs npm install --save koa-views/cnpm install --save koa-views npm install e ...
- koa中返回404并且刷新后才正常的解决方案
概述 这几天学习koa2,有一些心得,记录下来,供以后开发时参考,相信对其他人也有用. 起因 这几天学习koa2,写的代码执行时有一个奇怪的bug:明明能够返回数据,却有时正常返回数据,有时偏偏给你返 ...
- Android Handler机制 (一个Thead中可以建立多个Hander,通过msg.target保证MessageQueue中的每个msg交由发送message的handler进行处理 ,但是 每个线程中最多只有一个Looper,肯定也就一个MessageQuque)
转载自http://blog.csdn.net/stonecao/article/details/6417364 在android中提供了一种异步回调机制Handler,使用它,我们可以在完成一个很长 ...
- iView - Form中想要重置DatePicker生效,必须给DatePicker绑定value属性
Form中想要重置DatePicker生效,必须给DatePicker绑定value属性
随机推荐
- 常用API String
Java的API以及Object类 Java的API Java的API(API: Application(应用) Programming(程序) Interface(接口)) Java API就是JD ...
- 手机号读取城市数据库2018年3月excel版
EXCEL表中是更新到2018年3月份的手机归属地数据库. 手机号读取城市数据库2018年3月excel版.zip
- ubuntu 安装vue+element
1.安装npm sudo apt install npm 检测安装npm -v 因为npm安装软件慢,可设置淘宝镜像 npm config set registry https://registry. ...
- VS2017 Debug断点后显示UTF8字符串
断点后跟踪字幕文件文本,因为国内字幕一般是UTF8的,VS默认显示不出来,在变量上双击,加入 ,s8就可以了 默认 修改后 其他 ,数字 将变量拆分为数组显示, 数字是要显示多少位, 此法对cons ...
- MySQL数据库(五)使用pymysql对数据库进行增删改查
折腾好半天的数据库连接,由于之前未安装 pip ,而且自己用的python 版本为3.6. 只能用 pymysql 来连接数据库,(如果有和我一样未安装 pip 的朋友请 点这里http://blog ...
- Linux 使用记1 fastx toolkit安装问题
1 安装fastx toolkit的时候,步骤按https://blog.csdn.net/LotusWang0723/article/details/78723409 其中可能会出现如下报错 tex ...
- JS入门经典第四章总结
charAt():该函数有一个参数,即选择哪一个位置上的参数.返回值就是该位置上的字符. charCodeAt():该函数有一个参数,即选择哪一个位置上的参数.返回值是该位置字符在Unicode字符集 ...
- EasyUI 学习(1)-Tooltip(提示框)
一.创建组件 Tooltip不依赖其他组件 1.使用class加载 <a href="#" class="easyui-tooltip" title=&q ...
- MFC编程汇总
1.visual2017专业版MFC编程环境搭建及第一个MFC程序的创建 2.通过MFC设计一个简单的计价程序 3.控件——静态空间.编辑框控件.命令按钮.复选框和单选控件 4.控件添加——静态控件. ...
- vuex简单使用
1.创建src/store/index.js----仓库所在地----暴露store 2.main.js入口文件处引入store,挂载到Vue根实例中 3.创建store/movie.js-----电 ...