繁体   English   中英

不带参数的Node.js中间件如何工作?

[英]How does this Node.js middleware work without arguments?

我正在使用其他人为expresspassport编写的函数,该函数按以下方式定义了中间件(?):

function isLoggedIn(req, res, next) {
    if (req.isAuthenticated()){ 
        return next(); 
    }
    else{
        req.flash('error', 'You need to be logged in to access this page');
        res.redirect('/login');
    }
}

此功能在路由器中的用法如下:

app.get('/page', isLoggedIn, function(req, res){
    // ...
});

我不明白的是,不应该使用参数reqres调用该函数吗? 也许next回调不是必需的,因为它是app.get的下一个参数,但是该函数如何访问reqres 我希望它被称为如下:

app.get('/page', isLoggedIn(req, res), function(req, res){
    // ...
});

不指定参数如何工作?

谢谢,

传递给app.get()app.use()所有函数都会自动通过req, res, next调用req, res, next传递给它们。 这就是app.get()app.use()的实现方式。

为了帮助您理解,此示例:

app.get('/page', function(req, res){
    console.log(req.params.foo);
});

在功能上与此相同:

app.get('/page', myHandler);

function myHandler(req, res) {
    console.log(req.params.foo);
});

您不想做这样的事情:

app.get('/page', isLoggedIn(req, res), function(req, res){
    // ...
});

因为在这里您尝试执行isLoggedIn(req, res) (当尚未定义reqres时),然后将其返回值传递给app.get() 那根本不是你想要的。 您需要将函数引用传递给app.get() ,它将在调用函数时提供参数。 任何时候将()放在Javascript函数之后,都意味着您现在想执行它。 但是,如果仅传递函数名称,则该函数引用可以存储并在以后根据需要调用。

此代码示例与此类似:

var result = isLoggedIn(req, res);

app.get('/page', result, function(req, res){
    // ...
});

除了由于执行程序时未在程序启动时定义reqres而导致错误的事实之外,希望您可以看到自己现在不想执行isLoggedIn() 相反,您只想传递一个函数引用,以便Express稍后可以调用它。

在这段代码中

app.get('/page', isLoggedIn, function(req, res){
    // ...
});

正在使用三个参数调用app.get方法:

  1. 页面的路由: /page
  2. 中间件功能
  3. 请求处理函数

基本上,这段代码告诉Express框架,当收到针对/page路径的GET请求时,它应该调用两个函数:第一个是中间件函数,第二个是处理程序函数。

这里要注意的重要一点是它是完成工作的框架。 该框架将调用中间件函数,然后将调用处理程序函数。

我不明白的是,是否应该不使用参数req和res调用该函数?

get函数内部的某个位置使用这些参数调用它。 假设这是简化的get ,实现为

// a super simple get that will expect a function
// and call the function with two arguments
function get( f ) {
    var res = 1, req = 1;
    f( res, req );
}

有传递功能的多种方式get 例如,您传递一个匿名函数

get( function( res, req ) {
   return res + req;
}

您还可以传递在其他地方定义的命名函数

function isLoggedIn( res, req ) {
   return res + req;
}

get( isLoggedIn );

但是,这不是您期望的:

get( isLoggedIn( res, req ) );

这里的问题是

isLoggedIn( res, req )

不再是函数声明 这是一个调用调用的结果取决于resreq是什么。 运气好的话,该调用甚至可以产生一个数字值,这意味着get不再使用function作为参数来调用,而是使用function调用的结果来调用。

简而言之,要将命名函数传递给另一个函数,您无需指定其参数。 假定的允许这样做的语法甚至没有意义,因为它与实际函数调用的语法(即调用的值)没有区别。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM