Node.js集成Passport JWT时req.login is not a function报错如何解决
问题解决方法
req.login is not a function报错的核心原因是Passport中间件没有正确初始化,且路由挂载顺序错误,按以下步骤修改即可解决:
- 修正index.js中的中间件加载顺序,新增Passport初始化配置
把你index.js里原来的Passport和auth相关代码替换为以下内容,确保Passport初始化完成后再挂载登录路由:
// 原有中间件保留 app.use(express.json()); app.use(express.urlencoded({ extended: true })); app.use(express.static(`public`)); app.use(morgan('common')); // 先导入和初始化Passport const passport = require('passport'); require('./passport'); app.use(passport.initialize()); // 再挂载auth路由 let auth = require('./auth')(app);
- 修复auth.js的依赖缺失和错误处理
你当前auth.js中用到了config配置但没有引入,且错误处理缺少return逻辑可能引发重复响应报错,修改后的完整代码如下:
const jwt = require("jsonwebtoken"), passport = require("passport"), config = require('./configs').config; // 新增配置导入 require("./passport"); let generateJWTToken = user => { return jwt.sign(user, config.passport.secret, { subject: user.Username, expiresIn: config.passport.expiresIn, algorithm: "HS256" }); }; /* POST login. */ module.exports = router => { router.post("/login", (req, res) => { passport.authenticate("local", { session: false }, (error, user, info) => { if (error || !user) { return res.status(400).json({ message: info ? info.message : "something is not right", user: user }); } req.login(user, { session: false }, error => { if (error) { return res.send(error); // 补全return避免后续代码执行 } let token = generateJWTToken(user.toJSON()); return res.json({ user, token }); }); })(req, res); }); };
- 补全passport.js中的密码校验逻辑
你当前的本地验证策略只校验了用户名是否存在,没有校验密码正确性,需补充对应逻辑(示例假设你的User模型已经定义了bcrypt密码校验方法validatePassword,可根据你的实际加密逻辑调整):
passport.use( new LocalStrategy( { usernameField: "Username", passwordField: "Password" }, (username, password, callback) => { console.log(username + " " + password); Users.findOne({ Username: username }, (error, user) => { if (error) { console.log(error); return callback(error); } if (!user) { console.log("incorrect username"); return callback(null, false, { message: "Incorrect username." }); } // 新增密码校验逻辑 if (!user.validatePassword(password)) { console.log("incorrect password"); return callback(null, false, { message: "Incorrect password." }); } console.log("finished"); return callback(null, user); }); } ) );
修改完成后重启服务即可正常调用/login接口获取JWT令牌。
内容的提问来源于stack exchange,提问作者Myles Jefferson
相关产品推荐
相关产品推荐

