首页 > 解决方案 > 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-validator。

任何人都可以提出任何可能导致此问题的建议吗?

标签: node.jsjsonexpress

解决方案


需要注意的一件事是,express-validator不仅可以进行验证,还可以修改或“清理”数据。出于这个原因,如果在接收和查看 中的值之间有任何修改req.body,那么检查验证器的设置是一个很好的起点。

在这种情况下,行为可以归因于escape: trueor escape(),它将 HTML 样式实体应用于值。

快速验证器中的消毒示例:

export default [
  body('name').trim().escape()
]
export default {
    name: {
        in: ['body'],
        trim: true,
        escape: true
}

删除 'escape' 选项或函数调用将解决此问题。


推荐阅读