2

我正在学习 Node.js,并且我已经阅读了一些教程,例如用于学习核心功能的 The Node Beginner Book。但是我读的例子越多,我开始收集的疑问就越多。

在从教程获得的进一步示例中,我们可以看到对于 key 的 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');
         }
      });
   }
}

我不明白的是:

  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().
4

2 回答 2

9

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

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

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

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

资源:

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

于 2012-06-04T13:22:06.740 回答
0

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

我发现很少有文章可以很好地解释这个主题。看看那里:

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

主要思想是您有一组层,每次新请求到达时,它都会经过每个级别,并且在每个级别上您都可以决定如何处理。您可以在某个级别停止,做某事并返回响应,或者您可以将其传递到下一层

于 2015-08-06T19:33:40.760 回答