我正在学习Node.js,我已经阅读了一些教程,比如The Node Beginner Book,用于学习核心功能。但是我越是阅读一些例子,我开始收集的疑惑就越多。
在另一个从教程中获得的示例中,我们可以看到,对于密钥/documents/titles.json
的CRUD“读取”请求,我们返回一个值:
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');
}
});
}
}
我不明白的是:
loadUser()
函数有三个参数:req,res,next,但我至少没有看到你如何从app.get()
“req”参数传递给loadUser()
。从哪里来?loadUser()
函数内部,当您执行next()
时,意味着函数app.get()
“可以继续其过程,但是这个req.currentUser = user,是相同的req,即用于app.get()
函数?loadUser()
函数内部,当您执行res.redirect()
代码时,会自动中断app.get()
函数上的过程,对吧?看起来它没有返回Document.find()
。答案 0 :(得分:9)
您提出的问题主要是关于Express框架内部的问题:
当你调用app.get(route,loadUser,final)时,Express将使用loadUser和final函数创建一个堆栈(数组),它会知道当你调用next时它应该执行以下函数具有相同req和res params的堆栈。
当您调用next时,它将传递给中间件堆栈中的下一个函数。
由于您调用res.redirect并且未调用return,因此它不会传递给堆栈中的下一个函数(具有Document.find的函数)。
资源:
答案 1 :(得分:0)
我认为为了对此感到满意,您需要熟悉中间件的概念以及它在连接框架中的使用方式。
我发现这篇主题解释得很好的文章很少。看看那里:
http://howtonode.org/connect-it 在这里http://stephensugden.com/middleware_guide/
主要思想是你有一组图层,每当新请求到达时,它会通过每个级别,在每个级别上你可以决定如何处理它。您可以在某个级别停止,执行某些操作并返回响应,或者您可以将其传递到下一层