node.js - Express 正在将 HTML 实体应用于 JSON 正文
问题描述
我们有一个使用 express 和 body-parser 的基于 NodeJS 的应用程序。服务器正在侦听 JSON 格式的 REST 请求。我们遇到了一个问题,请求中的某些字符正在被 HTML/XML 转义,我们强烈怀疑 express 或 body-parse 方面的某些东西正在这样做,但我们无法弄清楚是什么在这样做。
在我们的测试场景中,我们使用 curl 发出请求:
curl 'http://localhost:6009/stores/1561289s12' \ ajmas@ghostwalker-echo
-X 'PUT' \
-H 'Accept: application/json, text/plain, */*' \
-H 'Content-Type: application/json; charset=utf-8' \
--data-raw $'{"name":"O\'Neil"}' \
--compressed
在服务器上,当我们查看 中的name
值时req.body
,它会显示为:
O'Neil
导致我们将矛头指向 express 或 body-parser 的原因是,当我们使用 Wireshark 检查时,我们会看到我们发送的正文。
我们初始化 JSON 解析如下:
app.use(express.json({}));
- Express 版本是 4.17.1
- 节点 JS 版本:14.15.1
该项目还使用了 express-validator。
任何人都可以提出任何可能导致此问题的建议吗?
解决方案
需要注意的一件事是,express-validator不仅可以进行验证,还可以修改或“清理”数据。出于这个原因,如果在接收和查看 中的值之间有任何修改req.body
,那么检查验证器的设置是一个很好的起点。
在这种情况下,行为可以归因于escape: true
or escape()
,它将 HTML 样式实体应用于值。
快速验证器中的消毒示例:
export default [
body('name').trim().escape()
]
export default {
name: {
in: ['body'],
trim: true,
escape: true
}
删除 'escape' 选项或函数调用将解决此问题。
推荐阅读
- cefsharp - 绑定对象不释放
- laravel - 突然间,我在测试中得到了 UnexpectedJavascriptException
- python - 如何将坐标从图像映射到 2D 表面
- angularjs - 如何使用 $resource POST 操作设置自定义标题?
- javascript - 看来我的 ajax 有效,但没有发布任何内容
- android - 如何在 Firebase 数据库子参考中使用字符串?
- c# - 需要 WCF 安全说明
- javascript - 如何在 JS 淡入淡出幻灯片中插入 CSS 转换旋转动画?
- corda - 在 corda 项目中创建 build.gradle 文件要遵循的步骤
- javascript - 如何计算同一类的两个平均值,并得到两个输出?