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

如何在Mocha测试运行前启动Koa服务以解决接口404报错问题

问题解决方案

1. 优先排查端口冲突问题

如果本地同时运行了index.js启动的3000端口服务,会导致测试脚本中的服务启动失败,请求时出现异常。你可以先关闭本地已启动的3000端口服务,或者将测试用端口改为不冲突的端口(例如3001)。
同时优化before钩子的错误监听逻辑,避免启动失败时无感知继续执行用例:

before(done => {
  server = app.listen(3000)
  server.on('listening', done)
  server.on('error', done) // 启动出错时直接抛出错误,终止测试流程
})

2. 解决服务启动时序问题

如果确认是服务未完全就绪就执行测试,可以选择以下任意一种方案兜底:

方案A:给测试请求增加重试逻辑

不需要引入第三方依赖,适合简单场景:

it('should return response from server', async () => {
  let response
  // 最多重试3次,每次间隔500ms
  for (let retryCount = 0; retryCount < 3; retryCount++) {
    try {
      response = await axios.get('http://localhost:3000/api/test')
      break
    } catch (err) {
      if (retryCount === 2) throw err
      await new Promise(resolve => setTimeout(resolve, 500))
    }
  }
  // 注意:你原代码的expect描述字符串少了闭合引号,这里已经修复
  expect(response.data, 'should return object with key "resp"').to.have.property('resp')
})

方案B:等待端口就绪后再执行测试

安装wait-port依赖检测端口可用性:

npm install wait-port --save-dev

修改before钩子:

const waitPort = require('wait-port')

// ...
before(async () => {
  server = app.listen(3000)
  // 等待最多3秒,直到3000端口可访问
  await waitPort({ host: 'localhost', port: 3000, timeout: 3000 })
})

3. 其他排查建议

  • 运行测试时添加--no-cache参数避免Node加载缓存的旧版代码:npx mocha 测试文件名 --no-cache
  • 捕获请求错误时打印err.response内容,确认返回404的是不是你的Koa服务,快速定位问题来源。

内容的提问来源于stack exchange,提问作者Shambala

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 13:18:04