1

在節點上使用Express.js和Mongoose構建REST API - 我在模型或路由器上偶然發現了代碼設計問題 - 我應該在哪裏處理關係?Express.js和Mongoose模型關係 - 在模型或路由器中?

首先,我對MVC很新穎,即使express.js不是完整的MVC,我也想遵循最佳設計實踐。

問題很簡單 - 應用程序有用戶,每個用戶可以有多個文檔(項目,訂單等)。顯然,我必須至少存儲每個創建文檔的用戶標識。問題是 - 我應該在哪裏做?

我可以從每個路由器中的會話中獲取用戶標識並將其附加到文檔,或者我可以將當​​前用戶標識設置爲全局變量,例如app.currentUserID並在我的模型中使用該標識附加該文件的ID。

實際上有更多有趣的情況,用戶可以擁有多個組織,並且我必須爲用戶在與特定組織一起操作時創建的每個文檔設置組織標識。

所以問題是:我應該在我的路由器中處理這種邏輯(express沒有'controllers'這樣的)還是model?

回答

2

在模型中做它。即使你沒有創建強制關係,存儲相關對象的實際ID仍會改變模型,所以沒有理由將邏輯放在路由器中。

MongoDB(和Mongoose)不像關係數據庫那樣具有參照完整性。這意味着如果您將關係插入不存在的對象,數據庫不會給您一個錯誤。它讓應用程序代碼處理這些關係。

Mongoose是一種嘗試將結構引入其他非常自由的nosql數據庫。因此,它提供了與ObjectId模式類型建立這種關係的能力。

閱讀下面的SO回答更多的信息:https://stackoverflow.com/a/7813331/1801

+0

謝謝,這是有道理的。我還研究了Yii PHP框架的源代碼,它似乎也處理模型中的這類事情,儘管我認爲它會在控制器中實現。 – ragulka

+0

對任何可能閱讀此內容的人來說,只是一個警告詞:只有當您有權訪問'req'對象時,纔可以在模型中設置當前用戶ID。因爲Mongoose沒有辦法將'req'對象從控制器/路由傳遞給模型構造函數,所以我必須處理控制器中的管理關係。所有這些都是由於節點的異步性質 - 你不能簡單地設置一個像'app.currentUser'這樣的全局變量,因爲它將爲所有網站用戶設置。 – ragulka