使用Passport时报Cannot read property 'passport' of undefined如何解决
报错原因
- 未注册
express-session中间件:你仅在app.js中导入了express-session依赖,但没有完成中间件注册。Passport的会话管理功能完全依赖express-session提供的会话对象支撑,缺少该中间件会导致Passport读取不到会话存储,触发属性读取失败错误。 - 中间件顺序错误:即使你后续注册了express-session,也需要保证该中间件的注册顺序在
passport.initialize()、passport.session()之前,否则Passport依然无法正常获取到会话信息。
解决方案
修改app.js的中间件注册逻辑,补充express-session配置并调整顺序,参考修改后的代码片段:
const express = require('express'); const morgan = require('morgan'); const path = require('path'); const app = express(); require('./lib/passport.js') const mysql = require('mysql'); const myConnection = require('express-myconnection'); const session = require("express-session"); const passport = require('passport'); // settings app.set('port', process.env.PORT || 3000); app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'ejs'); app.use(express.urlencoded({extended: false})); app.use(express.json()); // 新增:注册express-session中间件,必须放在Passport相关中间件之前 app.use(session({ secret: '自定义你的会话加密密钥,生产环境请存入环境变量不要硬编码', resave: false, saveUninitialized: false })) // Passport中间件注册要放在express-session之后 app.use(passport.initialize()); app.use(passport.session()); // 其余原有逻辑保持不变 app.use(morgan('dev')); app.use(require('./routes')); app.use(express.static(path.join(__dirname, 'public'))); app.listen(app.get('port'), () => { console.log('Server on port', app.get('port')); });
如果完成上述修改后仍有报错,可检查./lib/passport.js中是否正确注册了local.signup策略,以及是否完成了passport.serializeUser、passport.deserializeUser的序列化逻辑配置。
内容的提问来源于stack exchange,提问作者Zerimex
相关产品推荐
相关产品推荐

