NodeJS:找到错误:听EADDRINUSE ::: 3000?

OrA*_*yag 4 node.js express jestjs


我目前遇到的错误是我几个小时都无法解决的。
我正在使用以下版本:
节点:8.11.3
Express:4.16.3
Jest:22.2.2
猫鼬:5.2.3

我正在尝试使用Jest 做一些集成测试,并且我有2个带有测试的文件。
在每个文件中,我写了以下内容:

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

// Close the server after each test
afterEach(async () => {
    if (server) {
        server.close();
    }
});
Run Code Online (Sandbox Code Playgroud)

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}...`);
});
Run Code Online (Sandbox Code Playgroud)

当我跑步时,我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 |
Run Code Online (Sandbox Code Playgroud)

我尝试了几种方式加入来解决这个async awaitbeforeEachafterEach,并试图也把sever.close中afterAllbeforeAll,但仍然得到了同样的错误。

然后,我尝试通过以下方法解决:
进程被杀死时,如何正常关闭Express Server?

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

Nic*_*ius 7

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

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

在package.json脚本中:

"scripts": {
    ...
    "test": "jest --watchAll --verbose --runInBand",
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

...
await server.close();
...
Run Code Online (Sandbox Code Playgroud)

[更新]我相信解决此问题的更好方法是将index.js文件分离为index.js和server.js文件。这使您无需.listen就可以将index.js文件拉入测试中:

// index.js
const express = require("express");
const app = express();

app.get("/", (req, res) => {
  res.status(200).send({ hello: "world!" });
});

module.exports = app;
Run Code Online (Sandbox Code Playgroud)

然后在单独的server.js文件中:

const server = require("./index");

const PORT = process.env.PORT || 3001;

server.listen(PORT, () => {
  console.log(`App running on: ${PORT}`);
});

module.exports = server;
Run Code Online (Sandbox Code Playgroud)

运行应用程序时,您运行:node server.js

然后,您可以通过将index.js文件拉入测试中来测试路由,如下所示:

// test.js
const request = require("supertest");
const server = require("./index");

describe("GET /", () => {

  test("should return status 200", async () => {
    const res = await request(server).get("/");
    expect(res.status).toBe(200);
  });


});

Run Code Online (Sandbox Code Playgroud)

  • runInBand可以工作,但是有点创可贴。等待server.close()不适用于我,看着上面的代码,我认为我遇到了同样的问题(codingwithmosh?) (2认同)