gpt4 book ai didi

做 Passport nodejs时的javascript语法

转载 作者:行者123 更新时间:2023-12-02 14:27:41 25 4
gpt4 key购买 nike

我有一个关于 JavaScript 语法的问题。实际上,我在自学 MEAN 堆栈教程时想出了编码(https://thinkster.io/mean-stack-tutorial#adding-authentication-via-passport)。下面有一个非常奇怪的编码。

})(req, res, next);

(req, res, next) 似乎是参数,但没有函数利用该参数。也许我现在还不够聪明,所以我看不到它。有没有人可以帮助我解决这个问题?谢谢。

router.post('/login', function(req, res, next){
if(!req.body.username || !req.body.password){
return res.status(400).json({message: 'Please fill out all fields'});
}

passport.authenticate('local', function(err, user, info){
if(err){ return next(err); }

if(user){
return res.json({token: user.generateJWT()});
} else {
return res.status(401).json(info);
}
})(req, res, next);
});

最佳答案

要了解发生了什么,您应该知道 Express 中的“中间件”是什么。这是一个可以传递给 Express 的函数,它会传递一个请求对象、一个响应对象和一个下一个函数:

function middleware(req, res, next) {
...
}

使用中间件,您可以“利用”HTTP 请求通过 Express 应用程序所遵循的路径,并执行某些操作。

您可能已经注意到中间件函数签名看起来很像您的示例代码:

router.post('/login', function(req, res, next) { ... });

这是一个路由处理程序,针对发送到 /loginPOST 请求而调用。路由处理程序与中间件类似,因为它们使用相同的参数进行调用,并且还执行某些操作(通常,next 不会在路由处理程序中使用,但它仍然会作为参数传递) .

您也可以“堆叠”中间件:

router.post('/login',
function (req, res, next) { ... }, // first middleware
function (req, res, next) { ... }, // second middleware
...
);

这就是 next 发挥作用的地方:如果第一个中间件对请求不感兴趣,它可以调用 next (这是一个函数)和请求将被传递给第二个中间件(如果该中间件对此不感兴趣,它也可以调用 next ,将请求沿着应用程序中的所有中间件传递,直到中间件处理该请求或它失败,生成 404 错误,因为没有找到可以处理请求的中间件)。

passport.authenticate() 还返回一个中间件函数。通常这样使用:

router.post('/login',
passport.authenticate(...),
function (req, res, next) { ... }
);

这意味着,如果您查看堆栈示例,passport.authenticate() 应该返回一个接受三个参数 reqres 的函数code> 和 next (事实上,确实如此)。

这意味着上面的代码可以重写为:

router.post('/login', function(req, res, next) {
passport.authenticate(...)(req, res, next);
});

这与您问题中的代码相匹配。 为什么您想要调用passport.authenticate(),就像这是一个相对高级的 Passport 主题。

编辑:从广义上讲,这就是passport.authentication的样子:

// a function that mimics what `passport.authenticate` does:
function myAuthenticate() {
return function (req, res, next) {
...some stuff...
next();
};
}

这是一个返回函数的函数。您可以像这样使用它:

router.post('/login',
myAuthenticate(),
function (req, res, next) {
...
}
);

这(几乎)与此相同:

router.post('/login',
function(req, res, next) { // <-- this is the function that got returned!
...some stuff...
next();
},
function(req, res, next) {
...
}
);

关于做 Passport nodejs时的javascript语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38085927/

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