【问题标题】:What is next(); in this code?下一步是什么();在这段代码中?
【发布时间】:2013-08-25 18:27:03
【问题描述】:

在这个 Express 应用程序(用于 Nodejs)中有一行代码使用 next();,我不明白。不知道你能不能澄清一下。

在 index.js 中,express 应用调用了一个函数 isLoggedInMiddleware。它不传递任何参数

 app.use(sessionHandler.isLoggedInMiddleware);

这就是那个函数。调用的时候没有传任何参数,但是设置成接受三个,next是最后一个,作为getUsername的返回值调用。

this.isLoggedInMiddleware = function(req, res, next) {
    var session_id = req.cookies.session;
    sessions.getUsername(session_id, function(err, username) {
        "use strict";

        if (!err && username) {
            req.username = username;
        }
        return next();
    });
}

这是 getUserName which next();作为 callbak 的一部分传递给。你能解释一下如何 next();被使用了?在这种情况下是什么?它在做什么?

this.getUsername = function(session_id, callback) {
        "use strict";

        if (!session_id) {
            callback(Error("Session not set"), null);
            return;
        }

        sessions.findOne({ '_id' : session_id }, function(err, session) {
            "use strict";

            if (err) return callback(err, null);

            if (!session) {
                callback(new Error("Session: " + session + " does not exist"), null);
                return;
            }

            callback(null, session.username);
        });
    }

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    它将控制权传递回快速应用程序以调用链中的下一个中间件/请求处理程序。

    这里:

    app.use(sessionHandler.isLoggedInMiddleware);
    

    您告诉 express 使用 isLoggedInMiddleware 作为中间件。

    每个中间件都会收到:

    • 请求 - 丰富和/或查询,
    • 响应 - 以防他们想写一些东西(即错误),
    • 允许 express 继续处理请求的回调。

    该中间件在被 express 调用时,会使用用户数据丰富请求对象,然后将控件返回给 express,然后继续到下一个中​​间件或处理程序。

    【讨论】:

    【解决方案2】:

    据我了解,它将控制权传递给下一个路由处理程序来处理请求。阅读Route Middleware

    【讨论】:

      【解决方案3】:

      您将传递函数与调用混淆了。

      app.use(sessionHandler.isLoggedInMiddleware);
      

      这不是isLoggedInMiddleware被调用;它只是被通过了。 app.use 接受一个应该是函数的参数;在请求期间,它将使用适当的参数(请求对象、响应对象和回调)调用该函数。

      同样,

      sessions.getUsername(session_id, function(err, username) {
          "use strict";
      
          if (!err && username) {
              req.username = username;
          }
          return next();
      });
      

      next 的返回值没有被传递给getUsername;整个函数正在被传递。通过调用next,它将控制权交还给 express 框架(本质上说,“我完成了;调用下一个中间件”)。

      【讨论】:

        【解决方案4】:

        我认为next的调用意思很明显“请转到列表中的下一个中间件”。然而,更有趣的是为什么前面有一个return

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-07-30
          • 1970-01-01
          • 2020-10-24
          • 1970-01-01
          • 2020-04-14
          • 2014-01-16
          • 2016-06-23
          • 2011-03-08
          相关资源
          最近更新 更多