gpt4 book ai didi

javascript - 这个 Node.js 中间件如何在没有参数的情况下工作?

转载 作者:太空宇宙 更新时间:2023-11-04 02:56:42 24 4
gpt4 key购买 nike

我正在使用其他人为 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 传递给它们。这就是 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 稍后可以调用它。

关于javascript - 这个 Node.js 中间件如何在没有参数的情况下工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42055664/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com