我在使用 Whatwg-fetch npm 从 javascript 节点模块访问 .Net WCF 提供的 REST 服务时遇到此问题。
请注意,上面的错误消息引用了一个看似空格的意外标记。
由于我无法弄清楚这是什么,所以我花了很多时间考虑其他可能的深奥问题,例如 CORS、身份验证、混合来自 fetch API++ 的 Promises。
最佳答案
原因是 WCF REST 服务通过此调用创建响应:
return WebOperationContext.Current.CreateTextResponse(
json,
"application/json; charset=utf-8",
Encoding.UTF8
);
事实证明,当 Microsoft 实现 Encoding.UTF8
编码时,他们选择在 json 字符串前面加上 UTF BOM 标记。结果是 JSON 左大括号前面有三个字符:
0xEF
、0xBB
、0xBF
。在 ISO-8859-1 或 CP1252 中查看时,它们看起来像这样 
。
在这种情况下,我确实应该相信错误消息,但就在我开始添加身份验证的前一天,我收到其他人的报告,说 REST 服务确实正常工作。然后我开始添加迄今为止缺少的测试 - 同时还添加身份验证。正是在这个阶段,我意识到所有测试都失败了。而且 - 回溯并没有真正帮助......
作为旁注:当代码在浏览器中运行时,它似乎对 BOM 标记更加宽容。然而,当在节点中运行测试时,它似乎更加挑剔......
解决方案是强制关闭编码的 BOM 标记,如下所示:
// Note, false to avoid BOM marker which breaks some clients not expecting BOM for utf-8
var utf8 = new UTF8Encoding(false);
return WebOperationContext.Current.CreateTextResponse(
json,
"application/json; charset=utf-8",
utf8
);
关于javascript - 语法错误: Unexpected token in JSON at position 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42218393/