将Passport认证路由逻辑移至控制器后无法正常运行
问题分析与解决方法
你把Passport认证逻辑迁移到控制器后,googleCallback无法生效的核心原因是逗号运算符的误用,同时代码执行顺序也有问题:
问题1:逗号表达式导致中间件丢失
在JavaScript中,逗号表达式会返回最后一个表达式的结果。你写的googleCallback实际上只返回了后面的(req, res) => {...}函数,前面的passport.authenticate中间件根本没有被执行。
问题2:路由挂载顺序错误
你的代码先调用app.get挂载路由,之后才定义authController,这会导致挂载路由时authController是undefined,必须先定义控制器再挂载路由。
正确写法示例
方式1:用数组包裹多个中间件(和原路由写法逻辑一致)
// 先定义控制器 const authController = { googleAuth: passport.authenticate('google', { session: false, scope: ['email', 'profile'] }), // 用数组存放多个中间件,Express支持直接接收数组形式的中间件 googleCallback: [ passport.authenticate('google', { session: false }), (req, res) => { res.send({ loggedUser: req.user.displayName }) } ] } // 再挂载路由 app.get('/auth/google', authController.googleAuth) app.get('/auth/google/callback', authController.googleCallback)
方式2:手动串联中间件(适合需要自定义逻辑的场景)
const authController = { googleAuth: passport.authenticate('google', { session: false, scope: ['email', 'profile'] }), googleCallback: (req, res, next) => { // 先执行Passport认证中间件,认证完成后再执行自定义响应逻辑 passport.authenticate('google', { session: false })(req, res, (err) => { if (err) return next(err); res.send({ loggedUser: req.user.displayName }) }) } } app.get('/auth/google', authController.googleAuth) app.get('/auth/google/callback', authController.googleCallback)
内容的提问来源于stack exchange,提问作者sonEtLumiere
相关产品推荐
相关产品推荐

