开发Discord机器人仪表盘报req.logIn is not a function错误如何解决
问题修复方案
核心原因1:Express中间件加载顺序错误
你当前在app.js中先挂载了/api路由,再初始化passport中间件,导致路由处理请求时,req对象还没有被passport注入logIn方法,触发报错。
修复步骤:
调整app.js中中间件和路由的加载顺序,修改后代码如下:
require('dotenv').config() require('./strategies/discord'); const express = require('express'); const passport = require('passport'); const session = require('express-session'); // 新增,需先安装依赖 const app = express(); const mongoose = require('mongoose'); const PORT = process.env.PORT || 3002; const routes = require('./routes'); mongoose.connect(`${process.env.DATABASE_URL}`, { useNewUrlParser: true, useUnifiedTopology: true, }); // 新增:先配置session中间件(passport.session依赖此组件) app.use(session({ secret: process.env.SESSION_SECRET, // 需在.env文件中添加SESSION_SECRET配置,值为任意随机字符串 resave: false, saveUninitialized: false, cookie: { maxAge: 86400000 } // 登录态有效期1天,可自行调整 })) // passport中间件放在路由之前 app.use(passport.initialize()); app.use(passport.session()); // 路由放在所有中间件最后挂载 app.use('/api', routes); app.listen(PORT, () => console.log(`Running on port ${PORT}`));
先安装缺失的express-session依赖:
npm install express-session
核心原因2:deserializeUser方法存在语法错误
你当前的strategies/discord.js中deserializeUser方法存在变量名冲突、查询参数未定义的问题,会导致登录态解析失败。
修复步骤:
替换原有的deserializeUser代码:
passport.deserializeUser(async (discordId, done) => { try { const user = await UserDB.findOne({ discordId }); return user ? done(null, user) : done(null, null); } catch (err) { console.log(err) done(err, null); } });
核心原因3:策略验证函数错误处理不完整
你当前Discord策略的验证函数中,捕获错误后没有调用done(),会导致出错时请求挂起。
修复步骤:
修改strategies/discord.js中验证函数的catch分支:
catch (err) { console.log(err); return done(err, null); }
以上修改完成后重启服务即可解决报错。
内容的提问来源于stack exchange,提问作者QuaBot
相关产品推荐
相关产品推荐

