express和koa中的超时处理

2023-11-09

从某个话题中得到的灵感,这里做一个分享,
http://cnodejs.org/topic/592fdc2f03dba3510d8a62a0#59364c3b538dbcaa6bc7dd48
楼主遇到一个问题,如何管理express中的超时?

express中的超时处理

现成的模块有connect-time,有一百五十个star,在中间件中已经算不少了,下面是一段使用connect-time的代码


var express = require('express')
var timeout = require('connect-timeout')

var app = express()
app.use(timeout('5s'))
//....一些中间件
app.use(haltOnTimedout)

// Add your routes here, etc.

function haltOnTimedout (req, res, next) {
if (!req.timedout) next()
}

app.listen(3000)

看起来很美好,然而实际上是有缺点的。

假设timeout的作用范围里中包含了一个名为query的中间件,长这个样子

function query(req, res, next) {
setTimeout(function() {    
res.send('respond with a resource');
}, 10000);
};

然后这样调用timeout

app.use(timeout('5s'))
app.use(query)
app.use(haltOnTimedout)

当然实际中可能是一个数据库操作或者别的,而且在某些情况下会因为阻塞让执行时间变得很慢,上面的代码中会在10秒后将数据返回前端,而这时timeout已经返回了一个超时相应,于是程序就gg了,报出一个Can’t set headers after they are sent的错误。


这个其实不能怪中间件,要怪express本身的机制,query中间件虽然加载了,然而里面的异步却不归timeout管。

这个问题有办法解决吗?一个思路是当timeout触发后,中断后面的异步操作,这个可以通过事件监听实现,然而很麻烦。

Koa中的timeout

所以说还是老老实实地用koa,能用同步写法就别写回调。
koa也有一些管理timeout的中间件例如koa-timeout,然而两三年没更新了,用的还是koa1.x的版本,好在也不是很难写,我就自己写了一个

var koa2-timeout = async function(ctx ,next){
var tmr = null;
const timeout = 5000;//设置超时时间
await Promise.race([
new Promise(function(resolve, reject) {
tmr = setTimeout(function() {
var e = new Error('Request timeout');
e.status = 408;
reject(e);
}, timeout);
}),
new Promise(function(resolve, reject) {
//使用一个闭包来执行下面的中间件
(async function() {
await next();
clearTimeout(tmr);
resolve();
})();
})
])
}

核心思路是用promise.race来看定时器和后面全部的中间件哪个先跑完,
* 如果定时器先跑完,返回错误信息,而且没有调用后续的next()
* 如果后面的中间件先跑完….那就是正常执行没毛病

下面是个调用的例子

var koa = require("koa");
var app = new koa();

app.use(koa2-timeout);

app.use(async (ctx,next)=>{
await myTimeout(1000);//这里如果改成6000就会返回超时信息
ctx.body = "end";
})

function myTimeout(ms) {
return new Promise((resolve, reject) => {
setTimeout(resolve, ms, 'done');
});
}

app.listen(3000);

其他的解决方案

仔细想想,还是有别的方案的,例如我们可以直接hack底层的res.end方法,只要在里面增加一个是否已经响应过的flag判断就好了。这里不再讲述

总结

Koa真是太好用了
比起express来koa的优点数不胜数

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

express和koa中的超时处理 的相关文章

随机推荐

  • 小程序代理平台怎么选?

    如今 越来越多的企业和组织开始使用小程序来实现其业务 小程序代理平台哪家好 怎么选 这是很多人都在纠结的问题 其实 找小程序代理平台并不难 但是找一家合适的小程序代理平台还是有地方需要注意的 一 小程序代理平台 那么 选择一家合适自己的代理
  • 输出时保留有效数字

    保留3位有效数字 1 C include
  • SQL优化

    1 确认是否建立索引 是否索引失效 原则 没有索引考虑加索引 有索引先看索引建立的是否合理以及尽量避免索引失效 1 1 如果不是业务需要查询所有字段 避免直接select 原因 完全没有走覆盖索引的可能 有可能索引失效 增加了数据传输的开销
  • 求集合的所有子集的算法(C++)

    求集合的所有子集的算法 对于任意集合A 元素个数为n 空集n 0 其所有子集的个数为2 n个 如集合A a b c 其子集个数为8 对于任意一个元素 在每个子集中 要么存在 要么不存在 对应关系是 a gt 1或a gt 0 b gt 1或
  • linux网络摄像头服务器,网络摄像头Logitech和Linux

    我有罗技c310相机 宣称的特点是720p30fps 如果您将相机连接到Windows 则记录与所述720p 30fps完全一致 图片清晰 挑战是将同一个摄像头连接到Orangepi 服务器Armbian 并在其上保存视频文件 相机显示为
  • 区块链:一场始料未及的革命

    当主流媒体还在忙于猜测加密货币价格及其黑市阴谋时 他们已经遗漏了这一切的本质事实 那就是 密码学家们悄然发明了一套全新的技术原型 Unitimes特约作者Haseeb Qureshi在其文章 区块链 一场始料未及的革命 Blockchain
  • Qt-OpenCV学习笔记--图像的腐蚀--erode()

    概述 通过一个特定的结构元素 腐蚀 一个图像 图像腐蚀的过程类似于一个卷积的过程 源图像矩阵A以及结构元素B B在A矩阵上依次移动 每个位置上B所覆盖元素的最小值替换B的中心位置值 即锚点处 完成整个腐蚀的过程 算法通俗理解 其运算过程就是
  • 如何科学进行用户分析?六大方法论了解一下!

    用户研究是用户中心的设计流程中的第一步 它是一种理解用户 将他们的目标 需求与商业宗旨相匹配的理想方法 能够帮助企业定义产品的目标用户群 在用户研究过程中 数据的使用及挖掘是非常重要的 那么 有哪些通用的用户分析方法 如何分析你的用户 本篇
  • verilog 产生16进制递增bin文件

    https verificationacademy com forums systemverilog how do i write binary dump file array my testbench w 写 r 读 a 追加 b 二进制
  • 手把手教你搞定 微信支付 跳出微信支付的坑 (公众号支付,核心代码可以用于小程序支付)

    1 准备工作 设置支付目录 请确保实际支付时的请求目录与后台配置的目录一致 否则将无法成功唤起微信支付 在微信商户平台 pay weixin qq com 设置您的公众号支付支付目录 设置路径 商户平台 gt 产品中心 gt 开发配置 如下
  • 2013年11月22日星期五(T3DLIB1剩余---1)

    现在进行T3DLIB的残余 define SCREEN DARKNESS 0 define SCREEN WHITENESS 1 define SCREEN SWIPE X 2 define SCREEN SWIPE Y 3 define
  • 【计算机网络】物理层:物理层要解决哪些问题?

    物理层考虑的是怎样才能在连接各种计算机的传输媒体上传输数据比特流 而不是具体的传输媒体 现有的计算机网络中的硬件设备和传输媒体的种类非常繁多 而通信手段也有许多不同方式 物理层的作用是尽可能屏蔽这些差异 使物理层上面的数据链路层感觉不到这些
  • iptables需求:开启防火墙:可以正常使用ssh服务,dns服务, httpd服务,chrony服务, nfs服务安装

    1 iptables需求 开启防火墙 可以正常使用ssh服务 dns服务 httpd服务 chrony服务 nfs服务 安装 yum install y iptables services 关闭firewalld 开启iptables sy
  • git的代码撤销步骤

    工作区的代码撤销 1 git status 查看哪些文件是修改过的 2 git checkout 文件路径 让这个文件回到最近一次git commit或git add时的状态 git add到暂存区的代码要撤销 1 git reset HE
  • 时序预测

    时序预测 MATLAB实现基于GRU门控循环单元的时间序列预测 递归预测未来 多指标评价 目录 时序预测 MATLAB实现基于GRU门控循环单元的时间序列预测 递归预测未来 多指标评价 预测结果 基本介绍 模型结构 程序设计 参考资料 预测
  • MySQL数据库、表常用命令

    目录 一 数据库分类 1 关系型数据库 2 非关系型数据库 二 MySQL相关基础 三 MySQL数据库基础操作 1 显示数据库 2 创建数据库 3 删除数据库 4 使用数据库 四 常用数据类型 1 数值类型 2 字符串类型 3 日期类型
  • 【C51】单片机芯片之——图解74HC595

    第一部部分用于快速查阅使用 详细的使用见文章第二部分 引脚图 14脚 DS SER 串行数据输入引脚 13脚 OE 输出使能控制脚 它是低电才使能输出 所以接GND 12脚 RCK 存储寄存器时钟输入引脚 上升沿时 数据从移位寄存器转存带存
  • Maven依赖冲突

    An attempt was made to call a method that does not exist 依赖冲突完整报错如下 Description An attempt was made to call a method tha
  • 字符串04--左旋转字符串

    字符串04 左旋转字符串 jz43 题目概述 解析 参考答案 注意事项 说明 题目概述 算法说明 汇编语言中有一种移位指令叫做循环左移 ROL 现在有个简单的任务 就是用字符串模拟这个指令的运算结果 对于一个给定的字符序列S 请你把其循环左
  • express和koa中的超时处理

    从某个话题中得到的灵感 这里做一个分享 http cnodejs org topic 592fdc2f03dba3510d8a62a0 59364c3b538dbcaa6bc7dd48 楼主遇到一个问题 如何管理express中的超时 ex