【问题标题】:express-validator converting body to [object Object]express-validator 将 body 转换为 [object Object]
【发布时间】:2020-03-28 17:00:05
【问题描述】:

我正在尝试为一个简单的演示快速应用程序转义表单输入,但我得到了一个我不理解的结果。

当我执行这条路线时:

/* Update a toy */
app.post('/toys/:id', [
    body().escape()
], (req, res) => {
    console.log("Update: ");
    console.log(req.body);
    toyController.update(req, res);
});

我得到这个输出:

Update: 
[object Object]

在我看来,请求正文好像被破坏了。

如果我删除中间件,

/* Update a toy */
app.post('/toys/:id', (req, res) => {
    console.log("Update: ");
    console.log(req.body);
    toyController.update(req, res);
});

我得到了预期的结果:

Update: 
{
  toy: {
    name: 'Playstation 4',
    description: 'A gaming console',
    manufacturer: 'Sony',
    price: '400'
  },
  commit: 'Update Toy'
}

更新:如果我调用 body('toy') 而不是 body(),我会得到以下结果:

{ toy: '[object Object]', commit: 'Update Toy' }

因此,问题似乎在于该主体是一个嵌套对象。

如何将验证/清理应用于body.toy 而不是所有body

有没有一种方法可以直接调用escape 代码并将其应用于特定字符串,而不是使用整个中间件设置?

【问题讨论】:

  • 试试:console.log(JSON.stringify(req.body));
  • 我明白了:"[object Object]"(这次是引号)。它看起来就像 body 的“对象性”被破坏了。
  • @Zack "[object Object]" 在对象上调用默认 toString() 函数时返回。当您指定 body().espace() 时,由于您的 body 是 express 验证器库中某处的对象,它应该在输入上调用 toString。 escape() 函数是 'validator' 库的一部分,它期望参数始终是一个字符串。为了进行消毒,您必须按照下面的答案分别选择每一个。
  • 您可以使用[body('toy.name').escape(), body('toy.description').escape()] 转义嵌套对象中的特定文件。

标签: node.js express express-validator


【解决方案1】:

您需要以正确的方式使用 body().escape()。请参考下面的示例。

const express = require('express');
const { body } = require('express- 
validator');

const app = express();
app.use(express.json());

app.post('/comment', [
  body('email')
    .isEmail()
    .normalizeEmail(),
  body('text')
    .not().isEmpty()
.trim()
.escape(),
  body('notifyOnReply').toBoolean()
], (req, res) => {
 // Handle the request somehow
});

上面的示例包含使用 express 验证器的正确方法。在上面的示例中,我们正在验证电子邮件和文本字段,因此我们可以利用相同的链来应用一些清理,例如电子邮件规范化 (normalizeEmail) 和修整(trim)/HTML转义(escape)。 notifyOnReply 字段未经过验证,但仍可以使用相同的检查函数将其转换为 JavaScript 布尔值。

对不起,缩进不好,我从手机发布答案。

由于您修改了问题。您可以通过 express-validator 使用模式验证。

https://express-validator.github.io/docs/schema-validation.html

【讨论】:

  • 调用body('toy') 而不是body 会产生这个结果:{ toy: '[object Object]', commit: 'Update Toy' } 我认为问题在于数据是嵌套的。我会相应地更新问题。
  • 使用模式验证,而不是正文,因为您的对象包含嵌套数据和多个键。
猜你喜欢
  • 2012-12-27
  • 1970-01-01
  • 1970-01-01
  • 2014-05-09
  • 2012-06-03
  • 1970-01-01
  • 2016-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多