我在 Nest.Js API 中遇到以下问题: 每天大约 3 到 5 次,每次大约 1 小时,API 响应无法正确处理 UTF-8 特殊字符。例如,像
这样的 JSON 响应{ "name":"若昂·佩索阿" } 返回为 {“姓名”:“若奥·佩索阿”}.
在调试时,我得出的结论是,字符在 API 逻辑之后被损坏,可能是在嵌套序列化器中。例如,在此代码片段中:
console.log(sendResourceDto);
const { data } = await firstValueFrom(
this.httpService
.post(
process.env.OTHER_SERVICE + '/resource',
sendResourceDto,
{
headers: {
'Content-Type': 'application/json; charset=utf-8',
},
}
).pipe( /* ... */ )
);
控制台日志中的字符仍然正确,但是一旦请求到达 OTHER_SERVICE(也是我们的代码库),它们就会损坏。这也会发生在常规控制器调用中。
我将这些时期与数据库、服务器或外部服务(在我的例子中是 AWS Lambda)中可能的使用高峰进行了比较,但我发现没有相关性。
我没有排除但可能存在的另一个选择是问题可能出在 NGINX 上。但是,我相信这不太可能,因为 OTHER_SERVICE 和我的 API 在本地进行通信,无需服务器的反向代理配置。
任何相关的事情都可以帮助我
我在开发中测试了几十种可能性,但无法重现问题。尽管如此,我试图在生产中强制发生错误,但它并没有发生。它只会在任意时间发生。”
在 Docker 上运行的 NestJS 应用程序是否也发生过同样的情况。使调试变得更加困难的是,容器启动时服务运行良好,但在随机时间(大约 30 分钟)之后,它开始失败并在 API JSON 响应中返回损坏的字符,正如您所描述的那样。
一旦开始返回损坏的字符,它就会保持这种状态,直到容器重新启动。
虽然我不能告诉你确切的原因,但原因与节点图像有关。
node:21.6.1-bookworm-slim
按预期工作,但升级到 node:22.7.0-bookworm-slim
我们收到此错误。