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

NestJS新增路由本地正常,生产环境请求返回404

NestJS新增路由生产环境404,本地正常的排查方案

问题概述

本地开发时,FilesController中新增的POST /xml/status路由能正常返回200,但部署到生产环境后,该请求返回404错误(提示Cannot POST /arquivo/xml/status),同控制器下的其他路由(如/xml/chaves)却能正常运行。已执行yarn build构建项目并通过pm2启动,服务器上的构建文件初步检查无异常。

相关代码片段

files.controller.ts

export class FilesController {
  constructor(
    private readonly documentoService: DocumentoService,
    private readonly filesService: FilesService
  ) {}

  @Post('/xml/chaves')
  @Header('Content-Disposition', 'attachment')
  async downloadXmlsPorChaves() {
    // 现有逻辑
  }

  @Post('/xml/status')
  @Header('Content-Disposition', 'attachment')
  async downloadXmlsPorQuerySemZipar(
    @Body() body: DownloadDocumentosByQueryDto,
    @CurrentUser() user: ReqUser,
    @Res() res: Response
  ) {
    try {
      const { filtros } = body;
      const documentos = await this.documentoService.getXmlsPorQuery({
        empresa: user.empresa,
        filtros,
      });

      const xmlTextArray = documentos.map((documento) => ({
        status: documento.status,
        xml: documento.xml.toString('utf-8'),
      }));

      res.status(200).json(xmlTextArray);
    } catch (error) {
      res.status(500).json({ error: 'Internal Server Error' });
    }
  }
}

files.module.ts

@Module({
  imports: [DocumentoModule, ConfigModule, DatabaseModule],
  providers: [FilesService],
  exports: [FilesService],
  controllers: [FilesController],
})
export class FilesModule {}

api.ts(请求代码)

export const apiQueryXmlDownloadComStatus = async (body: any) => {
  return await api.post('arquivo/xml/status', body, {
    responseType:'text',
  })
}

排查与解决步骤

1. 核对全局前缀配置

检查main.ts中的全局前缀设置,确认本地和生产环境是否一致:

// 检查是否设置了全局前缀
app.setGlobalPrefix('arquivo');
  • 如果本地未设置但生产环境设置了,需确认生产环境的配置是否正确加载,避免因前缀缺失导致路由不匹配。
  • 检查生产环境的.env等配置文件,确认是否有影响全局前缀的配置项。

2. 验证构建产物是否包含新路由

进入生产环境的dist目录,找到编译后的files.controller.js,检查是否存在/xml/status的路由定义:

  • 如果未找到,说明构建过程未包含新代码:
    • 先清理构建缓存:rm -rf dist
    • 拉取最新代码后重新执行yarn build
    • 检查nest-cli.json的sourceRoot配置,确保files.controller.ts在构建范围内

3. 重启PM2进程加载最新代码

PM2可能仍在运行旧版本的代码,执行以下命令重启:

# 重启指定进程
pm2 restart <你的进程名称>
# 或者重载配置(如果进程配置有变更)
pm2 reload <你的进程名称>

用pm2 show <进程名称>查看进程的启动路径和文件,确认是否指向最新的dist文件夹。

4. 检查文件系统大小写敏感性

生产环境如果是Linux服务器,文件系统是大小写敏感的,而本地Windows/macOS默认不敏感:

  • 确认控制器、模块的文件名大小写(如FilesController.ts和files.controller.ts)与import语句中的路径一致
  • 避免因大小写不匹配导致模块未被正确加载,进而路由未注册

5. 排查中间件/守卫的拦截逻辑

全局中间件、守卫可能拦截了新路由:

  • 检查全局中间件的路由过滤规则,确认/arquivo/xml/status是否在白名单内
  • 查看生产环境的应用日志,是否有中间件拒绝请求的相关报错

6. 确认请求路径是否重复前缀

检查前端请求的base URL:

  • 如果API的base URL已经包含/arquivo,那么请求路径arquivo/xml/status会变成/arquivo/arquivo/xml/status,导致404
  • 调整请求路径为/xml/status,或者修改base URL去掉重复前缀

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 14:22:15