【问题标题】:How to fix "listen EADDRINUSE: address already in use :::3000" error in Integration test?如何修复集成测试中的“listen EADDRINUSE: address already in use :::3000”错误?
【发布时间】:2022-02-12 01:11:10
【问题描述】:

我正在尝试在我的TypeScript 项目中使用jestsuperTest 测试我的简单端点,但我收到listen EADDRINUSE: address already in use :::3000 错误。

  • 我有一个app.ts 用于express 工作。这是我在测试文件中导入的那个。
  • 我有一个启动服务器的server.ts 文件。我没有在我的测试中使用它。

我在stackoverflow 上阅读了一些类似的问题,人们建议终止该进程。我的问题仅限于我的Integration Test。如果我使用Postman 进行测试,它工作正常。

问题:

  • 我应该停止afterEach 中的服务器吗?我不能 100% 确定这是否是一种有效的方法。

代码如下:

app.ts

import 'reflect-metadata';
import * as express from 'express';
import cors from 'cors';
import helmet from 'helmet';
import app from './server';
import routes from './routes/routes';
import errorHandler from './utils/errorHandler';
import LoggerService from './services/logger.service';

async function bootstrap() {
  app.disable('x-powered-by'); 
  app.use(cors());
  app.use(helmet());
  app.use(express.json());
  app.use(express.urlencoded({ extended: true }));
  routes(app);
  /**
 * Configure error handler
 */
  errorHandler(app);
}

// Need for testing purpose
export default app;

bootstrap()
  .then(() => {
    new LoggerService().logger.info('Server is up');
  })
  .catch((error) => {
    new LoggerService().logger.error(`Unknown error. ${error.message}`);
  });

server.ts

import * as dotenv from 'dotenv';
import express from 'express';
import LoggerService from './services/logger.service';

dotenv.config();

const server = express();

/**
 * App Variables
 */
if (!process.env.PORT) {
  process.exit(1);
}

/**
 * Setup listener port
 */
const PORT: string | number = process.env.PORT || 3000;
server.listen(PORT, () => {
  new LoggerService().logger.info(`Listening on port ${PORT}`);
});

export default server;

route.ts

import { Application } from 'express';
import container from '../ioc.container';
import HealthController from '../controllers/health.controller';

export default function RouteManager(application: Application) {
  const healthController = container.get<HealthController>(HealthController);

  application.get('/healthStatus', healthController.healthCheck.bind(healthController));
}

some.spec.ts

import { mockHealthCheck } from '../mockData/health.mockData';
import app from '../app';
import request from 'supertest';

describe('GET /healthStatus API Tests', () => {

  it('Receives 200 on successful call', async () => {
    const result = await request(app).get('/healthStatus');
    expect(result.statusCode).toEqual(200);
    expect(result.body.description).toEqual(mockHealthCheck.description);
    expect(result.body.status).toEqual(mockHealthCheck.status);
  });

  it('Receives 404 - Not Found on unsuccessful call', async () => {
    const result = await request(app).get('/invalidEndPoint');
    expect(result.statusCode).toEqual(401);
  });

});

【问题讨论】:

    标签: node.js typescript express supertest


    【解决方案1】:

    如果我在 app.tsserver.ts 文件中进行以下更改,我可以解决此问题。剩余文件保持不变(route.tssome.spec.ts)。

    app.ts

    /**
     * Required External Modules
     */
    import 'reflect-metadata';
    import * as dotenv from 'dotenv';
    import express from 'express';
    import cors from 'cors';
    import helmet from 'helmet';
    import routes from './routes/routes';
    
    dotenv.config();
    
    const app = express();
    
    /**
     *  App Configuration
     */
    app.use(helmet()); 
    app.use(cors());
    app.use(express.json());
    app.disable('x-powered-by'); 
    routes(app);
    
    export default app;
    

    server.ts

    import app from './app';
    import LoggerService from './services/logger.service';
    
    /**
     * App Variables
     */
    if (!process.env.PORT) {
      process.exit(1);
    }
    
    const PORT: number = parseInt(process.env.PORT as string, 10);
    app.listen(PORT, () => {
      new LoggerService().logger.info(`Listening on port ${PORT}`);
    });
    

    【讨论】:

      猜你喜欢
      • 2021-06-04
      • 2021-01-18
      • 1970-01-01
      • 2021-04-23
      • 2020-07-22
      • 2021-02-20
      • 2022-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多