我正在学习Node.js,我已经阅读了一些教程,比如The Node Beginner Book,用于学习核心功能.但是我越是阅读一些例子,我开始收集的疑虑就越多.
在另一个从教程中获得的示例中,我们可以看到,对于密钥的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 };
}));
});
});
Run Code Online (Sandbox Code Playgroud)
在此示例中,该函数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');
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
我不明白的是:
loadUser()函数有三个参数:req,res,next,但至少我没有看到你如何从app.get()"req"参数传递给loadUser().从哪里来?loadUser()函数内部,当你执行时next(),它意味着函数app.get()"可以继续它的程序,但是这个req.currentUser = user,与app.get()函数使用的req相同吗?loadUser()函数,当你执行res.redirect()代码时,自动打破app.get()函数的程序,对吧?它看起来好像没有回归Document.find().您提出的问题是关于Express框架内部的具体问题:
当你调用app.get(route,loadUser,final)时,Express将使用loadUser和final函数创建一个堆栈(数组),它会知道当你调用next时它应该在堆栈中使用相同的req执行以下函数和res params.
当您调用next时,它将传递给中间件堆栈中的下一个函数.
由于您调用res.redirect并且不调用return,因此它不会传递给堆栈中的下一个函数(具有Document.find的函数).
资源:
http://howtonode.org/getting-started-with-express
| 归档时间: |
|
| 查看次数: |
3497 次 |
| 最近记录: |