mocha supertest ECONNRESET

14

我正在使用Mocha和Supertest测试Node.js服务器。测试套件已经增长到1500个以上的测试。突然间,虽然所有要测试的代码仍然正常工作,但我的测试套件出现了以下错误:

{[Error:read ECONNRESET]code:'ECONNRESET',errno:'ECONNRESET',syscall:'read'}

如果我注释掉一些较早运行的测试,那么导致出错的测试会发生变化。 是什么原因导致这种情况?

1个回答

11

我在Mike Gradek的这篇Google Groups帖子中找到了答案:

我们使用mocha和supertest发出这些请求,意识到我们实际上是在每个请求上启动新的端口绑定,而不是重用现有的绑定。

所以像这样编写的代码:

var request = require('supertest');
var app = require('../app');
request(app).get(...);
request(app).get(...);

成为

var request = require('supertest');
var app = require('../app');
var supertest = request(app);
supertest.get(...);
supertest.get(...);

那对我们解决了问题。

对我也是一样。


1
好的,但是它为什么解决了这个问题?使用了所有的临时端口吗?当我进行足够的测试时,第二个版本甚至也会出现相同的问题。。。 - Paul S
1
即使我只创建了“supertest”一次,如果我进行足够的并行http请求,仍会出现相同的问题。 - Felipe Taiarol
1
和Felipe Taiarol一样,如果有足够的并行http请求,即使只创建了一个supertest,我也会遇到相同的问题。我的解决方案是对所有的http请求进行序列化,尽管这会减慢测试套件的运行速度。具体而言,在使用bluebird promises时,Promise.map(..., ..., { concurrency: 1 })为我解决了这个问题。 - Tim Heilman
通过使用单独的await运行三个supertest请求,我们成功解决了问题,而不是使用Promise.all - Jesse Carter
从Google群组帖子中,@PaulS说:“由于我们的测试设置,我们最终使用了比预期更多的文件描述符,导致操作系统开始终止它们,从而发送RST。我们修复了我们的测试,并且自此以后再没有看到RST。” - Herman J. Radtke III

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接