Express / Connect中间件如何工作?

时间:2012-06-04 12:53:11

标签: node.js express

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

我不明白的是:

  1. 我想node.js,在开始执行app.get之前,它会转到loaduser函数。 loadUser()函数有三个参数:req,res,next,但我至少没有看到你如何从app.get()“req”参数传递给loadUser()。从哪里来?
  2. loadUser()函数内部,当您执行next()时,意味着函数app.get()“可以继续其过程,但是这个req.currentUser = user,是相同的req,即用于app.get()函数?
  3. loadUser()函数内部,当您执行res.redirect()代码时,会自动中断app.get()函数上的过程,对吧?看起来它没有返回Document.find()

2 个答案:

答案 0 :(得分:9)

您提出的问题主要是关于Express框架内部的问题:

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

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

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

  4. 资源:

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

答案 1 :(得分:0)

我认为为了对此感到满意,您需要熟悉中间件的概念以及它在连接框架中的使用方式。

我发现这篇主题解释得很好的文章很少。看看那里:

http://howtonode.org/connect-it 在这里http://stephensugden.com/middleware_guide/

主要思想是你有一组图层,每当新请求到达时,它会通过每个级别,在每个级别上你可以决定如何处理它。您可以在某个级别停止,执行某些操作并返回响应,或者您可以将其传递到下一层