每次在使用burni FHIR Server時,都會跳出以下Warnings。
原本都不以為意,因為程式都可以正常運作,不過每次跳這些 warnings 心都很躁,所以這次來正視此問題。
Circular Dependency
會出現 Circular Dependency 的問題,是因為 module 之間互相 require。這裡舉一項例子:
從以上程式碼可以發現:Identifier.js require Reference.js同時Reference.js require Identifier.js
在讀取時會呈現以下狀況:Identifier->Reference->Identifier
使用 madge :
以上情況就叫做 Circular Dependency
而當 Reference 讀取 Identifier 時,為了避免無窮迴圈,會複製未完成的 Identifier 到 Reference 讓 Reference 讀取完畢。
Circular Dependency所造成的問題
開頭說到程式碼都正常運作,不過真實上問題算蠻大的。因為 Circular 讀取的問題,讓 mongoose 定義的資料表瞬間變得不夠不嚴謹。
使用 mongoose-schema-jsonschema 把 Identifier dump出來,可以發現 assigner變成了空物件,此情況在新增資料時讓 assigner.identifier 允許了各種欄位名稱,相對的嚴謹度就降低。
解決方案
參考 How to deal with cyclic dependencies in Node.js 彙整出以下方法:
module.exports建議使用module.exporst.name- 多一個module 
topDef初始化所有會circular的module - 所有type的引入都改由 
topDef引入 - 多一個module來 merge 兩個circular的module
 
最後使用 mongoose-schema-jsonschema 把 Identifier dump出來 發現 assigner.identifier 變成了 $ref 參照到自己。
完整範例: Github









