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

Node.js集成Passport谷歌认证时遇passport.use不是函数错误求助

问题:TypeError: passport.use is not a function

运行Passport谷歌认证时出现以下错误:

passport.use(new GoogleStrategy({
^

TypeError: passport.use is not a function
at Object. (D:\My Data\Works\React\Google authentication\auth.js:6:10)
at Module._compile (node:internal/modules/cjs/loader:1256:14)
at Module._extensions..js (node:internal/modules/cjs/loader:1310:10)
at Module.load (node:internal/modules/cjs/loader:1119:32)
at Module._load (node:internal/modules/cjs/loader:960:12)
at Module.require (node:internal/modules/cjs/loader:1143:19)
at require (node:internal/modules/cjs/helpers:110:18)
at Object. (D:\My Data\Works\React\Google authentication\index.js:6:1)
at Module._compile (node:internal/modules/cjs/loader:1256:14)
at Module._extensions..js (node:internal/modules/cjs/loader:1310:10)

Node.js v18.16.1

现有代码

auth.js

const passport = require("passport-google-oauth2");
const GoogleStrategy = require( 'passport-google-oauth2' ).Strategy;

require('dotenv').config()

passport.use(new GoogleStrategy({
    clientID:     process.env.GOOGLE_CLIENT_ID,
    clientSecret: process.env.GOOGLE_CLIENT_SECRET,
    callbackURL: "http://localhost:5000/auth/google/callback",
    passReqToCallback   : true
  },
function(request, accessToken, refreshToken, profile, done) {
        done(null,profile);
      }
));

passport.serializeUser((user,done)=>{
    done(null,profile)
});

passport.deserializeUser((user,done)=>{
    done(null,user);
})

index.js

const express = require('express');
const passport = require('passport-google-oauth2');
const session = require('express-session')
const path = require('path');
const app = express();
require('./auth');

app.use(express.json());
app.use(express.static(path.join(__dirname,'client')));

function isLoggedIn(req,res,next){
    req.user ? next() : res.sendStatus(401)
}

app.get('/',(req,res) => {
    res.sendFile(index.html);
});

//IMPORTANT TO SET COOCKIES

app.use(session({
    secret: 'mysecret',
    resave: false,
    saveUninitialized: true,
    cookie: { secure: false }
  }
));

app.use(passport.initialize());
app.use(passport.session());

//TILL HERE

app.get('/auth/google',
  passport.authenticate('google', { scope:
      [ 'email', 'profile' ] }
));

app.get( '/auth/google/callback',
    passport.authenticate( 'google', {
        successRedirect: '/auth/google/success',
        failureRedirect: '/auth/google/failure'
}));

app.get('/auth/google/failure',isLoggedIn,(req,res) => {
    res.send("Something went wrong");
});

app.get('/auth/protected',isLoggedIn,(req,res) => {
    let name = req.user.displayName;
    res.send(`Hello ${name}`);
});

app.use('/auth/logout',(req,res) => {
    req.session.destroy();
    res.send('see you again');
})

app.listen(5000,() => {
    console.log('listening on port 5000');
});

解决方案

核心问题是错误地将passport-google-oauth2作为Passport核心实例引入,而非官方的passport包,同时代码存在几处细节错误,修改如下:

  1. 安装核心Passport包
    确保已安装passport:
npm install passport
  1. 修正auth.js代码
const passport = require("passport"); // 改为引入核心passport包
const GoogleStrategy = require('passport-google-oauth2').Strategy;

require('dotenv').config()

passport.use(new GoogleStrategy({
    clientID: process.env.GOOGLE_CLIENT_ID,
    clientSecret: process.env.GOOGLE_CLIENT_SECRET,
    callbackURL: "http://localhost:5000/auth/google/callback",
    passReqToCallback: true
  },
function(request, accessToken, refreshToken, profile, done) {
        done(null, profile);
      }
));

passport.serializeUser((user, done)=>{
    done(null, user); // 修复变量错误:参数是user而非profile
});

passport.deserializeUser((user, done)=>{
    done(null, user);
})
  1. 修正index.js代码
const express = require('express');
const passport = require('passport'); // 改为引入核心passport包
const session = require('express-session')
const path = require('path');
const app = express();
require('./auth');

app.use(express.json());
app.use(express.static(path.join(__dirname,'client')));

function isLoggedIn(req,res,next){
    req.user ? next() : res.sendStatus(401)
}

app.get('/',(req,res) => {
    res.sendFile(path.join(__dirname, 'client', 'index.html')); // 补全index.html的正确路径
});

//IMPORTANT TO SET COOCKIES

app.use(session({
    secret: 'mysecret',
    resave: false,
    saveUninitialized: true,
    cookie: { secure: false }
  }
));

app.use(passport.initialize());
app.use(passport.session());

//TILL HERE

app.get('/auth/google',
  passport.authenticate('google', { scope: [ 'email', 'profile' ] })
);

app.get( '/auth/google/callback',
    passport.authenticate( 'google', {
        successRedirect: '/auth/protected', // 原successRedirect路径未定义,改为直接跳转到受保护路由
        failureRedirect: '/auth/google/failure'
}));

app.get('/auth/google/failure',(req,res) => { // 失败路由无需isLoggedIn中间件,否则会返回401
    res.send("Something went wrong");
});

app.get('/auth/protected',isLoggedIn,(req,res) => {
    let name = req.user.displayName;
    res.send(`Hello ${name}`);
});

app.get('/auth/logout',(req,res) => { // 用GET请求更符合HTTP规范
    req.session.destroy();
    res.send('see you again');
})

app.listen(5000,() => {
    console.log('listening on port 5000');
});

内容的提问来源于stack exchange,提问作者Shivranjan Bharadwaj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 04:13:25