You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 14:40:48