[英]Node.JS Joi casts error for unknown object
我正在运行Node.JS和Joi(包括express-joi-middleware),并试图静默忽略未知对象或剥离它们。 但是,无论我做什么都会返回错误。
const options = { wantResponse: false, stripUnknown: true };
app.post('/my-post', expressJoiMiddleware(testSchema, options), (req, res) => {
...
和
const options = { wantResponse: false, allowUnknown: true };
app.post('/my-post', expressJoiMiddleware(testSchema, options), (req, res) => {
...
给我:
{
"error": [
{
"message": "\"test\" is not allowed",
"path": "body.test",
"type": "object.allowUnknown",
"context": {
"child": "test",
"key": "test"
}
}
]
}
似乎可以使用:
const options = { wantResponse: false, joiOptions: { stripUnknown: true }};
每当将Joi验证添加到路由,有效负载或参数时,它都会严格检查属性。 .required()
表示该属性是必需的,但是,如果架构中未提及该属性,则它将其视为违规并引发该错误。
为了让Joi正常工作,您需要定义所有可能使用的东西。 这就是模式的定义-结构的所有字段的定义:是否需要。
我对Hapi.js
遇到了同样的问题,并将该属性添加到架构中以对其进行修复。
一个简单的例子是:
{
user: Joi.string().required(),
pass: Joi.string().required()
}
对于此路由 ,如果仅传递user
或pass
,则它将失败,因为也需要另一个。 但是,如果您尝试传递一个name
,它将再次因您收到的错误而失败,因为Joi无法识别该属性。 将其视为完整性检查,这样就不会将“恶性”字段作为有效负载传递。
如果将以上架构更改为:
{
...
name: Joi.string()
}
Joi毫无疑问会通过它,因为这样您就会知道name
是您可以期望的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.