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

Node.js集成Passport JWT时req.login is not a function报错如何解决

问题解决方法

req.login is not a function报错的核心原因是Passport中间件没有正确初始化,且路由挂载顺序错误,按以下步骤修改即可解决:

  1. 修正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);
  1. 修复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);
  });
}; 
  1. 补全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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 15:15:06