【问题标题】:Express-validator's default sanitizer doesn't work when chainedExpress-validator 的默认消毒剂在链接时不起作用
【发布时间】:2021-09-12 04:41:18
【问题描述】:

我在使用default() sanitizer from express-validator 时遇到问题。当我在链中使用它时,例如body("children").optional().isArray().default([])default 函数不做任何事情,导致children 成为undefined。但是,如果我将它们分成两个不同的语句(添加一个单独的 body("children").default([]) sanitizer 而不是与其他语句链接),它工作得非常好。这是一个最小的可重现示例...

import express from "express";
import { body } from "express-validator";

const app = express();

app.use(express.json());

app.post(
  "/fails",
  body("children").isArray().optional().default([]),
  (req: express.Request) => {
    console.log(`/fails output: ${JSON.stringify(req.body, null, 4)}`);
  }
);

app.post(
  "/works",
  body("children").isArray().optional(),
  body("children").default([]),
  (req: express.Request) => {
    console.log(`/works output: ${JSON.stringify(req.body, null, 4)}`);
  }
);

app.listen(3000);

...与这些库一起使用...

@types/express@4.17.12
express-validator@6.12.0
express@4.17.1
typescript@4.3.4

...给出这个输出:

/fails output: {}
/works output: {
    "children": []
}

POST 两个请求的正文都是空的(我正在使用 Postman 进行测试)。

为什么会这样?我尝试过在optionalisArraydefault 之间进行检查,但没有结果。尽管 /works 可以正常工作,但我不想为架构中的每个可选默认值重复相同的 body 语句两次。

有人知道如何解决这个问题吗?

【问题讨论】:

    标签: javascript node.js typescript express express-validator


    【解决方案1】:

    如果值为undefined,问题是optional验证器只是completely ignores验证链。

    您必须决定是否需要将children 字段作为默认值[],即使它在正文中完全缺失。然后删除optional。或者您可以继续不使用它,然后删除 default

    【讨论】:

    • 啊,我明白了。所以,我最终删除了optional,如果nullundefined等被传入并使用default并不重要,但是当defaultnull时,我有做.default(null).optional({ nullable: true }).isBoolean()。谢谢!
    • 但是,我已经在下面回答了我的问题。感谢您提供信息和文档页面!
    【解决方案2】:

    从链中删除.optional() 时,它可以工作。所以这段代码:

    import express from "express";
    import { body } from "express-validator";
    
    const app = express();
    
    app.use(express.json());
    
    app.post(
      "/fails",
      body("children").isArray().default([]),
      (req: express.Request) => {
        console.log(`/fails output: ${JSON.stringify(req.body, null, 4)}`);
      }
    );
    
    app.post(
      "/works",
      body("children").isArray().optional(),
      body("children").default([]),
      (req: express.Request) => {
        console.log(`/works output: ${JSON.stringify(req.body, null, 4)}`);
      }
    );
    
    app.listen(3000);
    

    /fails/works 提供正确的输出。但是,我不知道为什么会这样!为什么我不能.optional().default([])?为什么没有记录在案?如果有人感兴趣,我在 GitHub here 上创建了一个错误报告。

    【讨论】:

      猜你喜欢
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-06
      • 1970-01-01
      相关资源
      最近更新 更多