2016-02-12 117 views
2

我一直在爲express和node創建一個更好的架構來實現rest api。比方說,我有3種方法,我的路線中間件 -express js - 一個http請求如何與其他請求不同?

router.post('/users/:id', [ 
    UserService.getUserById, 
    UserController.setUser, 
    MailerService.sendSubscriptionMail 
]); 

我設立在調用UserService.getUserById req.session.user,然後使用該設置req.session.result在UserController.setUser。現在我正在使用存儲在req.session.result中的數據向該用戶發送郵件。

UserService -

exports.getUserById = function(req, res, next) { 
    . 
    . 
    req.session.user = data; 
    . 
    . 
}; 

module.exports = exports; 

UserController中 -

exports.setUser = function(req, res, next) { 
    . 
    . 
    req.session.result = req.session.user; 
    . 
    . 
}; 

module.exports = exports; 

MailerService -

exports.sendSubscriptionMail = function(req, res, next) { 
    // Using req.session.result here to send email 
}; 

module.exports = exports; 

現在我有一個關於上述過程的兩個問題 -

(一)有沒有CH因爲新的http req到另一個路由(它也有這些可以修改req.session的方法)可以修改req.session.result並且MailerService.sendSubscriptionMail不會獲得它需要發送給用戶的數據,或者那個req對象會和內存中的這個完全不同嗎? (b)是否有任何其他方法在中間件之間傳輸數據而不是設置req對象?

回答

1

是否有任何機會,一個新的HTTP REQ到另一條路線(也 有這幾樣可以修改req.session方法)可以修改 req.session.result和MailerService.sendSubscriptionMail沒有得到 它需要發送給用戶的數據還是將該請求對象 與內存中的這個完全不同?

req對象特定於此請求。該對象不能被另一個請求改變。但是,如果req.session中的會話是來自該特定用戶的所有請求共享的普通共享sesison對象,那麼req.session.result可能會被來自該用戶的另一個請求在幾乎同時進行處理(例如在各種異步操作中交錯) 。

如果你想確保該用戶沒有其他的要求可能會改變你的結果,然後把它放在req.result,不req.session.result,因爲沒有其他請求都必須req.result訪問。

除了設置req對象之外,還有其他什麼方法可以在中間件之間傳輸數據,而不是在 之間傳輸數據嗎?

reqres對象共享同一請求中間件處理程序中的信息正確的地方,因爲他們是唯一的這個特別的要求。請注意0​​對象,因爲它是由來自同一用戶的多個請求共享的。


到你的三個處理程序之間共享數據的另一種可能的方式是讓調用所有三個中間件處理程序的一個單一的中間件處理,然後共享單個函數內的數據(例如,把它傳遞給其他處理程序)。

例如,你可以改變你的第二兩種方法的調用簽名,以便你可以得到的數據出來setUser(),然後直接把它傳遞給sendSubscriptionMail()不使用reqsession對象來存儲它。

router.post('/users/:id', [UserService.getUserById, function(req, res, next) { 
    UserController.setUser(req, res, function(err, result) { 
     if (err) return next(err); 
     MailerService.sendSubscriptionMail(result, req, res, next); 
    }]); 
}); 
+0

增加了另一種方法來將它直接傳遞給'MailerService.sendSubscriptionMail()'。 – jfriend00

+1

感謝您的幫助!我想創建一個全局處理程序,從中我可以看到需要針對該特定請求調用的所有方法,因爲當我們在另一個方法內調用方法時,我們必須在各種文件之間切換以進行一些更改。你的第二個想法是創建一箇中間件處理程序來調用它們,看起來很棒。我一定會嘗試。 –