簡體   English   中英

盡管將 abort early false 設置為 JOI 驗證並沒有返回所有錯誤

[英]JOI validation is not returning all the errors despite setting abort early false

我一直在嘗試通過 joi 模式驗證我的有效負載。 但它並沒有返回我在模式中編寫的錯誤,而是只顯示一個錯誤。 即使我給像 name=int 這樣的有效負載,盡管給第二個輸入(即用戶名)一個整數值,但也只顯示一個自定義錯誤:

{“狀態代碼”:400,

"error": "錯誤請求",

“消息”:“名稱需要一個字符串”}

而是應該打印

{“狀態代碼”:400,

"error": "錯誤請求",

"message": "name 需要一個字符串"/"username 需要一個字符串" }

這是我的代碼:server.js

    const server = Hapi.server({
        port: 3000,
        routes: {
            validate: {
                options: {
                    abortEarly: false
                  },
                failAction: async (request, response, err) => {
                    throw Boom.badRequest(err.message);
                },
            },

        },
    });

joi-schmea.js

const NamePayload = Joi.object().keys({
    name: Joi.string().required().error(new Error('name expecting a string')),
    username: Joi.string().required().error(new Error('username expecting a string')),
    age: Joi.integer().required().error(new Error('age expecting a number')),

});

路線.js:

validate: {
        payload: Schema.NamePayload,

      },

我希望郵遞員不僅顯示第一條錯誤消息,還顯示所有錯誤消息 而且我也不想使用默認錯誤消息child must be string/int type error 這就是我使用新錯誤的原因。 我已閱讀有關該錯誤的所有 stackoverflow 文章,但沒有解決我的問題。 這是我使用的 hapi 和 joi 版本:

@hapi/joi:^15.0.3,

@hapi/hapi:^18.3.1,

根據我的理解,每個Joi錯誤都會拋出一個包含密鑰詳細信息ValidationError ,這是一個錯誤數組,每個錯誤都包含您的自定義錯誤消息,並且通過在您的模式中執行新的Error() ,您將重寫關鍵細節。 所以,我建議你這樣做:

用這個替換你的架構錯誤:

Joi.object().keys({
    name: Joi.string().required().error(() => 'name expecting a string'),
    username: Joi.string().required().error(() => 'username expecting a string'),
    age: Joi.number().integer().required().error(() => 'age expecting a number'),
});

然后在您的failAction Concat的那些內部err.details消息:

failAction: async (request, response, err) => {
    throw Boom.badRequest(err.details.map((error) => error.message).join('/'));
}

對於此有效負載:

{
   "name": 10
}

你會得到這個回應:

{
   "statusCode": 400,
   "error": "Bad Request",
   "message": "name expecting a string/username expecting a string/age expecting a number"
}

如果有人覺得這有幫助,請寫下:

在 joi.validate() 中使用:{ abortEarly: false }

例如: const joiResult = joiSchema.validate( { name, email, }, { abortEarly: false } );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM