Node.js+Express+Passport登录系统报Cannot read property 'passport' of undefined错误求助
问题描述
我正在使用Express、Node.js、Mongoose和Passport.js开发注册登录系统,注册功能运行基本正常,但登录模块存在严重问题:我编写的相关逻辑中触发TypeError: Cannot read property 'passport' of undefined错误,存在未定义的变量,但我始终无法定位问题根源,需要排查解决。
项目代码
app.js 代码
const express = require('express'); const path = require('path'); const bodyParser = require('body-parser'); const cors = require('cors'); const passport = require('passport'); const mongoose = require('mongoose'); const config = require('./config/database'); mongoose.connect(config.database); mongoose.connection.on('connected', () => { console.log('Connected to database ' + config.database); }); mongoose.connection.on('error', (err) => { console.log('Database error:' + err); }); const app = express(); const users = require('./routes/users'); const port = 3000; app.use(cors()); app.use(express.static(path.join(__dirname, 'public'))); app.use(bodyParser.json()); app.use(passport.initialize()); app.use(passport.session()); app.use('/users', users); app.get('/', (req, res) => { res.send('Invalid Endpoint'); }); app.listen(port, () =>{ console.log('Server started on port' + port); });
routes/users.js 代码
const express = require('express'); const router = express.Router(); const passport = require('passport'); const jwt = require('jsonwebtoken'); const User = require('../models/user'); router.post('/register', (req, res, next) =>{ let newUser = new User({ name: req.body.name, email: req.body.email, username: req.body.username, password: req.body.password }); User.addUser(newUser, (err, user) => { if(err){ res.json({success: false, msg:'Failed to register user'}); }else { res.json({success: true , msg:'User registered'}); } }); }); router.post('/authenticate', (req, res, next) =>{ res.send('AUTHENTICATE'); }); router.get('/profile', (req, res, next) =>{ res.send('PROFILE'); }); module.exports = router;
问题解决方案
该TypeError: Cannot read property 'passport' of undefined错误由Passport依赖的上下文缺失导致,按照以下步骤排查修复即可:
- 首先确认是否需要使用Passport的session持久化能力:如果是前后端分离的JWT验证场景,不需要session支持,直接删除app.js中的
app.use(passport.session())这行代码即可解决错误。 - 如果你需要使用session存储登录状态,需要先安装并配置express-session中间件,且必须配置在Passport初始化代码之前:
- 安装依赖:
npm install express-session - 在app.js中引入并配置session:
const session = require('express-session'); // 放在app.use(passport.initialize())之前 app.use(session({ secret: '自定义加密密钥', resave: false, saveUninitialized: false })); - 安装依赖:
- 补充Passport策略配置:你目前仅引入了passport模块,没有加载验证策略配置,需要在项目的config目录下新增passport.js文件编写本地/JWT验证逻辑,然后在app.js的
app.use(passport.initialize())之前加入代码require('./config/passport')(passport);加载策略。 - 检查User模型文件中的自定义方法是否正确挂载,避免方法调用时的this指向错误导致的上下文undefined。
内容的提问来源于stack exchange,提问作者im122
相关产品推荐
相关产品推荐

