帮我解决问题,发红包~ 偶尔提示错误 Cannot set headers after they are sent to the client ?
发布于 6 年前 作者 xulayen 8389 次预览 最后一次回复是 6 年前 来自 问答
You have triggered an unhandledRejection, you may have forgotten to catch a Promise rejection: Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
const rp=require('request-promise');
rp(...).then(...).catch(...).finally(function () {
// This is called after the request finishes either successful or not successful.
return res.send(_objResult);//这句偶尔会报错
});
上面那段是一个公共方法,我封装成了一个ApiCall,大部分都会走这个函数,有没可能是并发导致一个请求还未发送出去另一个请求又进来了?请大神帮忙看下~
QQ 617284237
29 回复
1
1
1
1
1
1
1
1
1
1
1
有多次调用res.send之类的方法就会出现这种
@zengming00 那意思是报错的这个地方之前还调用了一次send之类的方法么。但是并没有额
@xulayen 仔细查查,肯定有,或者不是在之前而是在之后
@zengming00
JSBINhttps://jsbin.com/xunututehi/edit?js
你的catch里面有没有返回呢? 如果有错误了,最后还会走finally
@shadow88sky
图上是源码 705行。
这个,在生产环境下有时候也会出现 这个错
请确保这些设置在 send之前 只要发送 send执行过一次,再涉及到 set cookie、set header这种设置 http head 部分的都会报错
send只能发送一次吧,write可以多次
@zhhb 是在send之前,现在又出现了一次
@zhhb
@zhhb
@zhhb 这里用了一个异步promise ,报错好像是报这个promie有问题。
下面是promise功能代码,看下是哪里没有捕获promise异常?
@shadow88sky @zengming00 @zhhb @ounana 大神们,帮我看看什么问题么
你看一下请求的返回头是不是开启了keep-alive。因为node服务端keepalive的超时默认是5000毫秒,要不把服务端默认时间改大,要不把客户端keepalive时间改小。否则客户端超时大于服务端,服务端TCP关了,但是客户端还以为这个TCP还在,准备复用也会报这个错。
@zy445566 没有开启呢
@zy445566 报错信息:
源码:
这是/redis/index.js
这是/forword/index.js
你是不是后面还有啥中间建执行了?
@heguangda 后面没有中间件执行,前面有中间件