我正在使用HAPI和Joi創建一個API來驗證輸入,並且在不同模塊之間共享我的驗證模式時遇到麻煩。 我使用的是基於組件的架構,看起來像如何在沒有循環依賴的模型之間正確共享Hapi Joi驗證模式
components
|_ moduleA
|_ moduleAController
|_ moduleAModel
|_ moduleARoute
|_ moduleAValidate
|_ moduleB
|_ moduleBController
|_ moduleBModel
|_ moduleBRoute
|_ moduleBValidate
|_ moduleC
...
在每個模塊中,moduleXRoute
創建關聯從moduleXController
處理程序,並從moduleXValidate
一個驗證的路由。
由於我使用淳佳,我對輸入數據執行一些測試,但如問題來了,我moduleA
保持的moduleB
列表和我moduleB
保持到moduleA
參考,因此這意味着在驗證:
var moduleASchema = {
_id: Joi.objectId(),
name: Joi.string().required(),
moduleB: Joi.array().items(Joi.alternatives().try(Joi.objectId(), moduleBSchema)),
};
var moduleBSchema = {
_id: Joi.objectId(),
name: Joi.string().required(),
moduleA: Joi.alternatives().try(Joi.objectId(), moduleASchema),
};
這就是爲什麼我認爲這將是一個很好的想法,moduleAValidate
和moduleBValidate
暴露moduleASchema
和moduleBSchema
其他模塊可以使用。
的問題是,它使一個循環依賴問題,因爲在上述情況下,我會:
//moduleAValidate.js
var moduleBSchema = require('../moduleBValidate').moduleBschema;
//moduleBValidate.js
var moduleASchema = require('../moduleAValidate').moduleAschema;
因此,這將是處理這個問題的好辦法嗎?
我發現簡單的方法是將所有模式集中在單個文件中,這可能在所有驗證器中都需要,但是我覺得它會與組件體系結構相沖突。