一个请求的res.header被写入另一个请求的消息头!!??
发布于 6 年前 作者 JarvisQJ 2922 次浏览 来自 问答

image.png 如图所示,用JMeter,10个线程同时跑接口,有多个token值被写入了同一个返回消息头,其他该有的反而没有。同时还产生了如下错误:

Error: Can't set headers after they are sent.
at validateHeader (_http_outgoing.js:491:11)
at ServerResponse.setHeader (_http_outgoing.js:498:3)
at ServerResponse.header (E:\formal\server\node_modules\restify\lib\response.js:218:10)
at loginResponse (E:\formal\server\controllers\user.js:48:17)
at loginResponse.next (<anonymous>)
at onFulfilled (E:\formal\server\node_modules\co\index.js:65:19)
at <anonymous>

感觉是牛头对了马嘴,这是什么鬼

12 回复

检测下代码,看是不是哪个调用忘记写 yield/await 了。

@zbinlin 没有你说的这个情况。你也遇到过类似问题?

虽然还没查到根源,但是已经可以解决了。是this!!! image.png 通过在图中两处打印this,发现this指向变了。 所以用let currentRes = this.response,缓存this.presponse可以解决当前问题。

哈哈 还不如 用一个私有的 self var self = this 绑定一下当前this 虽然和 let currentRes = this.respose 原理一样。。。。

这一次发现,let self = this来固定this指向的内容,也是不可靠的。连新赋值的self值也会变。有时间再找原因吧。

如果有大佬路过,请解释下,为什么在同一个代码块,this指向都会变(我遇到的情况是在并发情况下,this指向变了)

虽然在同一块代码中 但是你new 了 一次, new完 this 指向自然就变了。。。。

上面截图里的代码是在哪里被调用的?

@zbinlin 所有的变化都是在我截图的这段代码产生的,所以和上一级对象无关啊

@hewentaowx 这里的问题只出现在并发情况下,说的this指向变化是指,前后两处的this指向的是两个不同请求的this!

既然你说 this 不一样了,肯定是有不同的地方同时调用了这个函数,并且 this 不一样的。

@zbinlin 如果说不同地方调用,那只能是,并发情况下,两个请求分别调用到了这里

回到顶部