Express开发仪表盘页面报错TypeError: req.next is not a function求助
问题原因
你在dashboard.js的路由逻辑中存在**重复调用res.render()**的问题:你对admin配置数组做循环遍历,每一轮循环都会触发一次res.render(),而Express的响应方法(res.render/res.send/res.redirect等)仅允许调用一次,多次调用会破坏请求上下文的内部结构,最终触发TypeError: req.next is not a function报错。
修复方案
1. 优化admin判断逻辑,避免重复调用res.render
不需要循环遍历admin列表判断用户权限,直接用数组的includes方法校验用户id是否在admin列表内即可,修改dashboard.js的两个路由代码:
// 根仪表盘路由修改 router.get('/', isAuthorized, (req, res) => { database.sql("SELECT * FROM servers", (rows) => { // 直接判断当前用户id是否在admin配置数组中 const isAdmin = data.includes(String(req.user.id)) res.render('dashboard/dashboard', { guilds: req.user.guilds, servers: rows, user: req.user, admin: isAdmin }) }) }) // admin子页面路由修改 router.get('/admin', isAuthorized, (req, res) => { database.sql("SELECT * FROM servers", (rows) => { const isAdmin = data.includes(String(req.user.id)) // 非admin用户可以直接跳走或者返回无权限,按需调整 if (!isAdmin) return res.redirect('/dashboard') res.render('admin/admin', { guilds: req.user.guilds, servers: rows, user: req.user, admin: isAdmin }) }) })
2. 修复配置文件解析错误(潜在问题)
你当前读取的是.yaml后缀的配置文件,却使用JSON.parse解析,格式不匹配会导致解析报错。如果你的配置文件确实是YAML格式,需要安装js-yaml依赖后修改解析逻辑:
npm install js-yaml
修改配置读取代码:
const yaml = require('js-yaml') const dirAdmin = __dirname + `/../public/config/admin.yaml` // 原路径多了冗余的.,同步修正 const data = yaml.load(fs.readFileSync(dirAdmin, 'utf8'))
3. 补全deserializeUser逻辑(潜在问题)
当前passport.deserializeUser逻辑中如果未查到匹配用户,没有调用done回调,会导致请求无限挂起,修改如下:
passport.deserializeUser(async (id, done) => { console.log("Deserializing") try { const user = await User.findOne({ where: { id: id } }) done(null, user || null) } catch (err) { done(err, null) } })
内容的提问来源于stack exchange,提问作者olios
相关产品推荐
相关产品推荐

