Express-validator 的默认消毒剂在链接时不起作用

问题描述

我在使用 default() sanitizer from express-validator 时遇到问题。当我在链中使用它时,例如 body("children").optional().isArray().default([])default 函数不执行任何操作,导致 childrenundefined。但是,如果我将它们分成两个不同的语句(添加一个单独的 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,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 语句。

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

解决方法

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

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

,

当你回答自己的问题时总是喜欢它:)

从链中删除 .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,4)}`);
  }
);

app.listen(3000);

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