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
相关产品推荐
相关产品推荐

