Node.js应用中间件next()使用及Bearer令牌验证报错排查
问题分析与解决方案
错误原因
报错Error: Route.post() requires a callback function but got a [object Undefined]的核心原因是路由中引入的verifyToken中间件为undefined:
middlewares/verifyTokens.js中通过module.exports = verifyToken默认导出函数- 但
routes/index.js中错误使用对象解构导入:const { verifyToken } = require('../middlewares/verifyTokens')
默认导出的内容无法通过解构获取,导致verifyToken变量为undefined,Express路由注册时触发该错误。
修正步骤
1. 修正路由的中间件导入方式
修改routes/index.js,移除解构语法,直接导入默认导出的函数:
const { Router} = require('express') const userController = require('../controllers/index') // 去掉解构,直接导入默认函数 const verifyToken = require('../middlewares/verifyTokens') const router = Router() router.post('/login', userController.login) router.post('/profile',verifyToken ,userController.profile) module.exports = router
2. 完善verifyToken中间件(补充签名验证逻辑)
当前中间件仅提取了token,未验证其合法性(签名、有效期等),补充验证逻辑:
const { verify } = require('jsonwebtoken') const secret = process.env.SECRET; function verifyToken(req, resp, next) { const bearerHeader = req.headers['authorization']; if (typeof bearerHeader !== 'undefined') { const bearer = bearerHeader.split(" "); const token = bearer[1]; try { // 验证token签名与有效性 const decoded = verify(token, secret); // 将解码后的用户信息挂载到req,供后续控制器使用 req.user = decoded; next(); } catch (err) { resp.status(401).send({ result: 'Token无效或已过期' }) } } else { resp.status(401).send({ result: '缺少Token' }) } } module.exports = verifyToken
3. 修复控制器的变量声明问题
controllers/index.js中payload未声明,添加const避免全局变量污染:
const login = async (req, res) => { // 添加const声明 const payload = { "email": "abc@gmail.com", "password": "user123" } // 其余代码不变 }
测试验证
- 重启服务后,调用
/abc/login获取有效token - 调用
/abc/profile时,在请求头添加Authorization: Bearer <你的token>,即可正常访问;若token无效/缺失,会返回对应错误提示。
内容的提问来源于stack exchange,提问作者Ateeq
相关产品推荐
相关产品推荐

