[英]How does node.js next() middleware function work without arguments?
[英]How does this Node.js middleware work without arguments?
我正在使用其他人为express
和passport
编写的函数,该函数按以下方式定义了中间件(?):
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){
// ...
});
我不明白的是,不应该使用参数req
和res
调用该函数吗? 也许next
回调不是必需的,因为它是app.get
的下一个参数,但是该函数如何访问req
和res
? 我希望它被称为如下:
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)
(当尚未定义req
和res
时),然后将其返回值传递给app.get()
。 那根本不是你想要的。 您需要将函数引用传递给app.get()
,它将在调用函数时提供参数。 任何时候将()
放在Javascript函数之后,都意味着您现在想执行它。 但是,如果仅传递函数名称,则该函数引用可以存储并在以后根据需要调用。
此代码示例与此类似:
var result = isLoggedIn(req, res);
app.get('/page', result, function(req, res){
// ...
});
除了由于执行程序时未在程序启动时定义req
和res
而导致错误的事实之外,希望您可以看到自己现在不想执行isLoggedIn()
。 相反,您只想传递一个函数引用,以便Express稍后可以调用它。
在这段代码中
app.get('/page', isLoggedIn, function(req, res){
// ...
});
正在使用三个参数调用app.get
方法:
/page
基本上,这段代码告诉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 )
不再是函数声明 。 这是一个调用 , 调用的结果取决于res
和req
是什么。 运气好的话,该调用甚至可以产生一个数字值,这意味着get
不再使用function作为参数来调用,而是使用function调用的结果来调用。
简而言之,要将命名函数传递给另一个函数,您无需指定其参数。 假定的允许这样做的语法甚至没有意义,因为它与实际函数调用的语法(即调用的值)没有区别。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.