0

使用具有以下设置的 express 和 body-parser:

const express = require('express');
const bodyParser = require('body-parser');
const app = express();

app.use(bodyParser.json({limit: '100mb', extended: true,type: 'application/*+json;charset=utf-8'}))
app.use(bodyParser.urlencoded({limit: '100mb', extended: true}));
app.use(bodyParser.text({defaultCharset: 'utf-8'}));
app.use(express.json());

使用 npm start 运行 nodejs 服务器时,json 正文中的特殊字符按预期进行 utf-8 编码。一旦托管在 IIS 中,字符编码就会失败。唯一的区别是托管环境。使用“utf-8”设置为托管 nodejs 服务器应用程序的 IIS 站点正确设置了 .NET 全球化选项,没有任何区别。仔细检查 web.config。什么可能会弄乱传入的请求数据?

json 正文请求输出 - 当 nodejs 托管在 IIS 中时

托管在 IIS 中的 nodejs 输出

json body 请求输出 - 当服务器直接使用 npm start 运行时:

托管在 IIS 中的 nodejs 输出

关于可能发生的事情的提示: https ://www.i18nqa.com/debug/bug-utf-8-latin1.html

有谁知道在哪里看?

4

1 回答 1

0

找到了问题,这可能很简单,因为它很愚蠢。无论如何我都会发布它,因为我花了很多时间在错误的地方寻找。问题被分开了。用于查看服务器上记录的请求的 baretail 应用程序使用 ANSI 字符集运行。将其更改为 UTF-8 在屏幕上正确显示特殊字符。进一步接收此请求的 API 将特殊字符保存为“未知字符” - 导致我开始研究 nodejs 服务器上的问题。

绝对值得注意 - 进一步接收此请求的 API 是 Facebook Conversions API -> https://developers.facebook.com/docs/marketing-api/conversions-api/using-the-api#verify。它不会将请求处理为“application/json”,而是“application/x-www-form-urlencoded”,其中包含包含json对象的表单数据请求以及设置为“json”的facebook参数“format”。Content-Type "application/json" 在技术上适用于此 API 调用,但特殊字符与 "unknown char 问号" 符号一起保存。在标头中设置“Accept-Language”或在请求中设置 facebook“locale”参数不适用于此 API 调用。

于 2020-11-16T10:28:19.703 回答