Express处理程序函数参数执行

时间:2015-12-08 14:23:50

标签: javascript node.js function express parameters

快速路线设置如下

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参数传递的?

2 个答案:

答案 0 :(得分:3)

使用时

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的更多信息。希望它有所帮助!

答案 1 :(得分:2)

express app.get函数将字符串作为第一个参数,将函数作为第二个参数。当应用程序侦听路由并找到路由'/signout'时,它会在该时刻执行 ,您在第二个参数中提供的函数将req和{{1}传递给它对象。 该函数在声明res时没有执行。

可以编写相同的代码(假设您使用Passport来使用app.get('/signout', users.signout);方法):

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('/'); }); 的第二个参数,但在同一个地方明确声明其逻辑。