Express/Connect中间件如何工作?

use*_*811 2 node.js express

我正在学习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)

我不明白的是:

  1. 我想node.js,在开始执行app.get之前,它会转到loaduser函数.loadUser()函数有三个参数:req,res,next,但至少我没有看到你如何从app.get()"req"参数传递给loadUser().从哪里来?
  2. loadUser()函数内部,当你执行时next(),它意味着函数app.get()"可以继续它的程序,但是这个req.currentUser = user,与app.get()函数使用的req相同吗?
  3. 内部loadUser()函数,当你执行res.redirect()代码时,自动打破app.get()函数的程序,对吧?它看起来好像没有回归Document.find().

ale*_*lex 9

您提出的问题是关于Express框架内部的具体问题:

  1. 当你调用app.get(route,loadUser,final)时,Express将使用loadUser和final函数创建一个堆栈(数组),它会知道当你调用next时它应该在堆栈中使用相同的req执行以下函数和res params.

  2. 当您调用next时,它将传递给中间件堆栈中的下一个函数.

  3. 由于您调用res.redirect并且不调用return,因此它不会传递给堆栈中的下一个函数(具有Document.find的函数).

资源:

http://howtonode.org/getting-started-with-express

  • 您应该将此标记为已接受的答案 (5认同)