2017-08-10 79 views
1

我正在使用hapijs編寫微服務。我有一個請求體中有三個參數的API(POST方法)Joi驗證 - 運行時所需的字段條件

  • 用戶名
  • 出生

我打算用JOI做驗證的日期。驗證應該是以下

  1. 如果兩個姓氏和出生日期是 在請求

  2. 兩個姓氏和出生日期不存在,如果用戶名是應要求應要求用戶ID缺席

我試圖通過以下來實現。它似乎沒有工作。

export const userRequestModel = Joi.object().keys({ 
    lastname: Joi.string().when('uid', 
     { 
      is: undefined, 
      then: Joi.string().required() 
     }), 
    dob: Joi.string().when('uid', 
     { 
      is: undefined, 
      then: Joi.string().required() 
     }), 
    uid: Joi.string(). 
     when('lastname', 
     { 
      is: undefined, 
      then: Joi.string().required() 
     }). 
     concat(Joi.string().when('dob', 
      { 
       is: undefined, 
       then: Joi.string().required() 
      })) 
}); 

串聯在語法上似乎不正確。它顯示下面的打字錯誤

類型'AlternativesSchema'的參數不能分配給'FunctionSchema'類型的參數。'AlternativesSchema'類型中缺少'Property'arity'參數。

回答

1

基本上,該模式創建一個循環依賴。

Error: item added into group uid created a dependencies error

......問題Joi沒有優雅的管理方式,特別是當有兩個以上的鍵時。擴展的討論可以在其他地方找到here

另一種可能是沿着線的東西:

Joi.alternatives().try(
    Joi.object().keys({ 
     lastname: Joi.string().min(1).required(), 
     dob: Joi.string().min(1).required(), 
     uid: Joi.string() 
    }), 
    Joi.object().keys({ 
     lastname: Joi.string(), 
     dob: Joi.string(), 
     uid: Joi.string().min(1).required() 
    }) 
); 

這是不漂亮,可能散架如果架構變得越來越複雜。

+0

謝謝@Ankh的答案。我從Joi社區成員WesTyler得到了另一個建議。請查看https://github.com/hapijs/joi/issues/1271。它看起來更加優雅。 – Keerthivasan

+0

Hi @Keerthivasan,感謝您的更新,絕對從閱讀中學到了一些東西! – Ankh