NodeJS:错误监听EADDRINUSE ::: 3000?

时间:2018-07-17 04:55:39

标签: node.js express jest


我目前遇到一个无法解决并且无法正常工作的错误。
我正在使用以下版本:
节点:8.11.3
快递:4.16.3
开玩笑:22.2.2
猫鼬:5.2.3

我正在尝试用玩笑做一些集成测试,并且我有2个文件进行测试。
在每个文件中,我写了以下内容:

// Create the server before each test
beforeEach(() => {
    server = require('../../index');
});

// Close the server after each test
afterEach(async () => {
    if (server) {
        server.close();
    }
});

index.js中,我有以下内容(这不是全部代码,而是与错误相关的代码):

// Listen to the server
const port = config.PORT || process.env.PORT || 3000;
module.exports = app.listen(port, () => {
   winston.info(`Listening to port ${port}...`);
});

当我运行 npm test 时 我一直都得到这个例外:

**listen EADDRINUSE :::3000**

  10 | // Listen to the server
  11 | const port = config.PORT || process.env.PORT || 3000;
> 12 | module.exports = app.listen(port, () => {
  13 |     winston.info(`Listening to port ${port}...`);
  14 | });
  15 |

我尝试了几种方法,将async await添加到beforeEach并为afterEach来解决此问题,还尝试将sever.close放入afterAll和{{1 }},但仍然出现相同的错误。

然后,我尝试通过以下方法解决:
How Do I Shut Down My Express Server Gracefully When Its Process Is Killed?

但是,再次没有运气。
最终,当我将所有测试写在1个文件中时,没有此beforeAll,它就可以工作。有人知道如何解决这个问题吗?我不想将所有集成测试写在一个文件中。.
谢谢!

4 个答案:

答案 0 :(得分:5)

尝试设置--runInBand标志,它将按顺序运行测试。

https://jestjs.io/docs/en/cli#runinband

在package.json脚本中:

"scripts": {
    ...
    "test": "jest --watchAll --verbose --runInBand",
    ...
}

[更新]在进一步调查中,虽然可以使用--runInBand顺序运行测试,但是另一个选择是等待server.close(),因为它返回了Promise。因此,在您的afterEach中:

...
await server.close();
...

答案 1 :(得分:1)

我遵循相同的课程,并且遇到相同的问题。 --runInBand为我解决了这个问题。

答案 2 :(得分:0)

我认为您的端口3000在其他地方繁忙,或者此应用程序正在终端中的其他位置运行,请检查并关闭此应用程序的所有实例。

尝试使用以下代码:

perl -E 'say join ", ", @ARGV' abc def ghi

答案 3 :(得分:0)

这里的问题是需要多次服务器文件。您不应该需要这样的服务器文件。每次执行此操作时,一个实例都会启动,在第一个测试文件中,一个服务器实例已启动,而在第二个文件中需要服务器时,它将尝试启动另一个实例,但随后您的服务器已经在3000上运行,因此会出现错误