簡體   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