繁体   English   中英

Node.JS Joi为未知对象投射错误

[英]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()
}

对于此路由 ,如果传递userpass ,则它将失败,因为也需要另一个。 但是,如果您尝试传递一个name ,它将再次因您收到的错误而失败,因为Joi无法识别该属性。 将其视为完整性检查,这样就不会将“恶性”字段作为有效负载传递。

如果将以上架构更改为:

{
    ...
    name: Joi.string()
}

Joi毫无疑问会通过它,因为这样您就会知道name是您可以期望的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM