关于passport.authenticate('local')末尾(req, res)的作用疑惑
搞懂Passport认证代码末尾的
(req, res) 嘿,这个点确实容易懵,我来给你拆解明白~
首先得先搞懂passport.authenticate()的本质:它本身是一个生成中间件的函数。
两种常见用法的区别
通常我们用Passport的时候,会直接把它作为Express路由的中间件,像这样:
router.post("/login", passport.authenticate('local', { session: false }), (req, res) => { res.send({ user: req.user }) } )
这种情况下,Express会自动调用passport.authenticate()返回的中间件函数,并且自动传入当前请求的req、res和next参数,我们不用管调用的细节。
但你写的代码里,给passport.authenticate()多传了一个自定义回调函数(就是处理err、user、info的那个函数),这时候它的行为就变了:它不会直接让Express自动处理,而是会返回一个等待被调用的函数,这个函数需要我们手动传入req和res才能触发认证流程。
末尾(req, res)的作用
你代码里的(req, res),就是立即调用passport.authenticate()返回的那个函数,把当前请求的req和res传进去。
举个更直观的例子,把代码拆成两步看:
router.post("/login", function (req, res, next) { // 第一步:调用passport.authenticate,得到一个待执行的认证函数 const handleAuth = passport.authenticate('local', { session: false }, function (err, user, info) { if (err || !user) { return res.status(400).send({ message: "Something went wrong", user: user }) } return res.send({user, info}) }) // 第二步:手动调用这个认证函数,传入req和res,触发认证逻辑 handleAuth(req, res) })
你原来的代码只是把这两步合并成一行了,直接在passport.authenticate(...)后面加(req, res),本质上是同一个意思——手动启动认证流程,让Passport能拿到请求数据、执行Local Strategy,最后通过你定义的回调返回结果。
为什么必须加这个?因为用了自定义回调后,Express不会再自动帮你调用那个中间件函数,你得自己把请求对象递进去,认证流程才能跑起来,不然整个逻辑就卡在这里没触发,路由自然不会返回任何响应。
内容的提问来源于stack exchange,提问作者Dijkie85
相关产品推荐
相关产品推荐

