Fix node.js mongoose circular dependency

Posted on Wed, Jan 26, 2022 MongoDB Node.JS

每次在使用burni FHIR Server時,都會跳出以下Warnings。

令人煩躁的 Warnings

原本都不以為意,因為程式都可以正常運作,不過每次跳這些 warnings 心都很躁,所以這次來正視此問題。

Circular Dependency

會出現 Circular Dependency 的問題,是因為 module 之間互相 require。這裡舉一項例子:

Identifier-Original.js
Reference-Original.js

從以上程式碼可以發現: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 允許了各種欄位名稱,相對的嚴謹度就降低。

Identifier-dump.json

解決方案

參考 How to deal with cyclic dependencies in Node.js 彙整出以下方法:

topDef.js
Identifier.js
Reference.js
merge.js

最後使用 mongoose-schema-jsonschema 把 Identifier dump出來 發現 assigner.identifier 變成了 $ref 參照到自己。

merge.js

完整範例: Github

參考資料