NodeJS:发现错误:听EADDRINUSE ::: 3000?

问题描述 投票:3回答:4

我目前正面临一个我无法解决并在几个小时内挣扎的错误。 我使用以下版本: 节点:8.11.3 快递:4.16.3 开玩笑:22.2.2 猫鼬:5.2.3 我正在尝试用jest做一些集成测试,我有两个测试文件。 在每个文件中我写了以下内容:

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

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

index.js中我有以下内容(这不是所有代码,而是bug的相关代码):

// 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添加到beforeEachafterEach,并尝试将sever.close放入afterAllbeforeAll,但仍然遇到了同样的错误。 然后,我尝试通过这样做来解决: How Do I Shut Down My Express Server Gracefully When Its Process Is Killed? 但同样,没有运气。 最后,当我在1个文件中编写所有测试时,它没有这个error。有人知道如何解决这个问题吗?我不想在1个文件中编写所有集成测试.. 谢谢!

node.js express jest
4个回答
6
投票

尝试设置--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
投票

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


0
投票

我认为你的端口3000在其他地方很忙或者这个应用程序正在终端的其他地方运行,检查并关闭这个应用程序的所有实例。

要么

尝试使用以下代码:

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

0
投票

这里的问题是需要多次服务器文件。您不应该要求这样的服务器文件。每次这样做,一个实例启动,在你的第一个测试文件中已经启动了一个服务器实例,同时需要服务器为你的第二个文件,它尝试启动另一个实例,但是你的服务器已经在3000运行,因此错误。

© www.soinside.com 2019 - 2024. All rights reserved.