You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js集成测试报错:ECONNREFUSED及Jest环境销毁后导入文件问题

问题描述

我正在学习Code with Mosh的Node.js课程,目前处于集成测试模块。运行以下测试代码时遇到两类错误:

  • connect ECONNREFUSED 127.0.0.1:80
  • ReferenceError: You are trying to import a file after the Jest environment has been torn down(错误来自tests/integration/genres.test.js)

测试代码:

const request = require('supertest');

let server;

describe('api/genres', () => {
        beforeEach(() => { server = require('../../app'); });
        afterEach(async() => { await server.close(); });

    describe('GET/', () => {
        it('should return all the genres', async () => {
           const res = await request(server).get('api/genres'); 
           expect(res.status).toBe(200); 
        });
    });
});
解决方案

1. 修复connect ECONNREFUSED 127.0.0.1:80错误

错误核心是请求路径缺少开头的斜杠/,supertest会将无开头斜杠的路径视为绝对路径,默认尝试连接80端口,而非你的应用服务。

修改测试中的请求路径,添加开头的/:

const res = await request(server).get('/api/genres'); // 路径以/开头

2. 修复ReferenceError: You are trying to import a file after the Jest environment has been torn down错误

这个问题源于模块缓存和服务器资源未彻底释放,可通过以下两种方式解决:

方式一:清理模块缓存+确保服务器关闭

在afterEach中清除app.js的模块缓存,避免重复require时复用旧实例:

afterEach(async () => {
  await server.close();
  // 清除app模块的缓存
  delete require.cache[require.resolve('../../app')];
});

方式二:全局启动/关闭服务器

将服务器的启动和关闭移到beforeAll和afterAll,而非每个测试用例都重启,减少资源冲突:

const request = require('supertest');

let server;

// 所有测试前启动一次服务器
beforeAll(() => { server = require('../../app'); });
// 所有测试结束后关闭并清理缓存
afterAll(async () => { 
  await server.close();
  delete require.cache[require.resolve('../../app')];
});

describe('api/genres', () => {
  describe('GET/', () => {
      it('should return all the genres', async () => {
         const res = await request(server).get('/api/genres'); 
         expect(res.status).toBe(200); 
      });
  });
});

注意:确保你的app.js导出的是http.createServer()返回的服务器实例,如果导出的是express app,需要先创建服务器再导出,例如:

// app.js
const express = require('express');
const app = express();
// ... 路由和中间件配置
const server = app.listen(3000);
module.exports = server;

内容的提问来源于stack exchange,提问作者Navpreet Singh Sidhu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 02:20:35