Express handler 函数参数执行

Express handler function parameter execution

快速路线设置如下

var users = require('../../app/controllers/users.server.controller');
// Set up the 'signout' route
app.get('/signout', users.signout);

但是,由于括号不存在,这意味着函数 users.signout 正在传递而不是执行?

github上的文件可以找到here

users.signout 函数如下所示

// Create a new controller method for signing out
exports.signout = function(req, res) {
    // Use the Passport 'logout' method to logout
    req.logout();

    // Redirect the user back to the main application page
    res.redirect('/');
};

github上的文件可以找到here

为什么users.signout被执行?它是如何传递 req 和 res 参数的?

当你使用

app.get('/signout', users.signout);

Express.js 基本上在内部存储给定函数 users.signout,并保持与 /signout 路径的关联。

当在该路由上发起请求时,Express.js会获取对应的存储函数并调用,大致如下形式:

// `storedFunction` corresponds to your `users.signout` function
storedFunction(expressReq, expressRes, expressNextCallback);

如果你要在调用中调用你的users.signout函数,即

app.get('/signout', users.signout());

您将无法获取 reqres 参数,并且 users.signout 函数实际上会立即执行,这意味着 app.get 函数实际上会接收你函数的结果

您可以阅读更多相关内容 in the documentation。希望对您有所帮助!

express app.get 函数将一个字符串作为第一个参数,将一个函数作为第二个参数。当应用程序侦听路由并找到路由 '/signout' 时,它会立即执行 您在第二个参数中提供的函数传递给它 reqres 对象。 该函数在声明 app.get('/signout', users.signout);.

时未执行

相同的代码可以写成(假设您正在使用 Passport 以便能够使用 logout 方法):

app.get('/signout', function(req, res) {
  // Use the Passport 'logout' method to logout
  req.logout();
  // Redirect the user back to the main application page
  res.redirect('/');
});

它实际上是一个函数,传递给app.get的第二个参数,但在同一个地方明确声明了它的逻辑。