我在學習Node.js,並且已經閱讀了一些教程,例如用於學習核心功能的Node Beginner Book。但是我越讀一些例子,我開始收集越多的懷疑。Express/Connect中間件如何工作?
在進一步的實例中,從一個教程獲得,我們可以看到,對於一個CRUD「讀」爲鍵/documents/titles.json
請求,我們返回值:
app.get('/documents/titles.json', loadUser, function(req, res) {
Document.find({ user_id: req.currentUser.id },[], { sort: ['title', 'descending'] },
function(err, documents) {
res.send(documents.map(function(d) {
return { title: d.title, id: d._id };
}));
});
});
在此示例中,函數loaduser()
是用於認證目的:
function loadUser(req, res, next) {
if (req.session.user_id) {
User.findById(req.session.user_id, function(err, user) {
if (user) {
req.currentUser = user;
next();
} else {
res.redirect('/sessions/new');
}
});
}
}
我不明白的是:
- 我想那個node.js,在開始執行app.get之前,它會去loaduser函數。
loadUser()
函數有三個參數:req,res,next,但我至少沒有看到你如何從app.get()
傳遞「req」參數到loadUser()
。它從哪裏來? - 內
loadUser()
功能,當你執行next()
,這意味着功能app.get()
「可以繼續其過程,但這個req.currentUser =用戶,是在app.get()
功能? - 內部使用
loadUser()
功能相同的REQ,當您執行res.redirect()
代碼,將自動斷開上app.get()
功能的過程中,正確的它看起來像它不返回Document.find()
關於您的第一個代碼示例:您絕對*無法*從異步函數中返回值。這不是異步代碼的工作方式。沒有返回值。你可以做的是調用另一個函數。 – Tomalak