问题描述
我在使用 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,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 对此进行测试)。
为什么会这样?我曾尝试处理 optional
、isArray
和 default
检查,但没有结果。尽管 /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 上创建了错误报告。