首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么让服务器已经在4000端口上运行,即使我已经关闭了服务器。

为什么让服务器已经在4000端口上运行,即使我已经关闭了服务器。
EN

Stack Overflow用户
提问于 2019-11-07 14:03:40
回答 2查看 730关注 0票数 0

我正在使用Jest库运行节点项目的单元测试,一切都很好。当我为路由身份验证创建新的测试时,它开始显示服务器已经在端口4000上运行,即使我使用afterEach()函数关闭服务,但不知道为什么服务器仍然在端口4000上运行。

甚至我已经删除了路由身份验证的新测试,并通过关闭所有终端重新启动我的项目,但是每当我运行该项目时,它就开始显示服务器已经在端口4000上运行的错误。

下面是用户测试文件中的代码,其中我正确地关闭了服务器,在下一个测试文件中,我再次使用了用于服务器连接和关闭的相同功能。

代码语言:javascript
复制
const request = require("supertest");
const { Genre } = require("../../models/genre");
const { User } = require("../../models/user");
const mongoose = require("mongoose");

let server;

describe("/api/genres", () => {
  beforeEach(() => {
    server = require("../../index");
  });
  afterEach(async () => {
    server.close();
    await Genre.remove({});
  });

第二次测试文件代码

代码语言:javascript
复制
const { User } = require("../../models/user");
const { Genre } = require("../../models/genre");
const request = require("supertest");
describe("auth middleware", () => {
  beforeEach(() => {
    server = require("../../index");
  });
  afterEach(async () => {
    await Genre.remove({});
    server.close();
  });

这是.的产出。如果没有提供令牌,auth中间件>应该返回401

代码语言:javascript
复制
listen EADDRINUSE: address already in use :::4000

  10 | 
  11 | const port = process.env.PORT || 4000;
> 12 | const server = app.listen(port, () =>
     |                    ^
  at Function.listen (node_modules/express/lib/application.js:618:24)
  at Object.<anonymous> (index.js:12:20)
  at Object.<anonymous> (tests/integration/auth.test.js:6:14)

测试套件:1次失败,3次通过,4次总测试:1次失败,26次通过,27次总快照:0次总时间:13.606秒运行所有测试套件。

Index.js码

代码语言:javascript
复制
const winston = require("winston");
const express = require("express");
const app = express();

require("./startup/logging")();
require("./startup/routes")(app);
require("./startup/db")();
require("./startup/config")();
require("./startup/validation")();

const port = process.env.PORT || 4000;
const server = app.listen(port, () =>
  winston.info(`Listening on port ${port}...`)
);
module.exports = server;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-08 07:21:24

我不是Node.js方面的专家,但是您的bug的本质非常简单;您正在尝试在一个已经被监听的端口上侦听。

This贴子提供了对require()的可靠描述,我认为这是您麻烦的根源。

通过在每个测试用例程序中调用require("../../index"),可以有效地导出服务器两次,这将导致两个app.listen()调用。

您最好一次性将服务器导出到某个主测试程序,在该程序中,您可以通过对每个测试文件调用require()来运行所有测试用例。从长远来看,这种方法也要好得多,因为添加额外的测试用例将更加容易;您只需编写一个新的测试脚本,将其导出到您的主测试程序,并将其附加到您的测试用例列表中。

票数 0
EN

Stack Overflow用户

发布于 2019-11-07 15:18:21

您的测试是多次创建服务器(index.js)。这使得服务器在许多情况下都试图侦听同一个端口。Jest文档上写着,

--如果您在许多测试中需要反复做一些工作,可以使用beforeEach和afterEach。

很明显,您应该创建服务器一次,做所有的测试,并关闭它一次。其方法是beforeAllafterAll

在某些情况下,只需要在文件开始时安装一次

。当设置是异步的时,这可能特别麻烦,所以您不能内联地执行它。Jest提供了beforeAll和afterAll来处理这种情况。

所以,你的测试应该是,

代码语言:javascript
复制
describe("auth middleware", () => {
  beforeAll(() => {
    server = require("../../index");
  });
  afterAll(async () => {
    await Genre.remove({});
    server.close();
  });
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58750447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档