2013-03-12 77 views
1

給定一個nodejs,mongoose,mongodb,expressjs設置,我們具有驗證特定請求的權限/安全相關路由。例如:在快遞中間件中重複使用貓鼬對象的模式

permissionUtils.checkStudentWritePermissions = function(req, res, next){ 
    //load this student from the mongoose db 
    //ensure the current user has permission to update this student 
} 

server.put("/api/student/:studentId/enroll", 
     permissionUtils.checkStudentWritePermissions, function(req, res, next){ 
    //load student from the database, validate the changes 
    //update student in mongodb, send new version back to user 
}); 

中間件很有用,因爲我們確保當前用戶有權在每種情況下更新學生。 (代碼重用等)你會注意到,在這兩個例子中,我正在從MongoDB中加載學生。有沒有一種可以接受的模式來避免這種雙重加載?某種請求循環緩存或傳遞模型的流暢方式?

+0

我通常從中間件向res.locals添加內容。像'res.locals.student = user;'那麼你的最終函數可以在res.locals中查找 - 這也會將它暴露給response/template對象。 – chovy 2013-03-13 00:12:41

回答

1

這裏有很多不同的解決方案。我會盡力快速給你一些。

1)首先,將代碼分離爲實際獲取(以及任何需要的預處理)到用戶模型中的函數中。其次,如果您沒有用戶模型,MVC方法將使您的代碼在增長時更容易遵循。從這裏開始,您可以輕鬆地在第一次調用時緩存響應,並在第二次調用時不需要從數據庫重新獲取即可。看看Memcached或Redis之類的東西。

2)雖然它可能不是慣例,但可以將對象從中間件傳遞到主函數中。如果你確實選擇這樣做,那麼明確你做了什麼,以便將來人們明白爲什麼你的中間件在下一次調用(req,res,obj),而不是用next()替換它來修復它。

3)第三種方法是將對象保存到res.locals(我相信這就是它現在所稱的)。這些是Express針對當前請求保留的值。將它保存在緩存中會類似,但只能在該請求期間訪問。在隨後的請求中,該對象將不得不重新提交。

請注意,無論您選擇哪種選項,爲常見訪問的對象實現某種緩存都會在幾乎所有情況下加快應用程序的速度。

+2

我使用了res.locals方法。我注意到,一旦你將它們放入redis並將它們拉出,mongo對象並不完全符合你的期望。 – chovy 2013-03-13 00:14:33