返回Promise时出现Cannot read property 'then' of undefined错误排查
问题根源与解决方案
这个错误的核心原因非常明确:你调用的authenticate.admin函数没有返回Promise对象,它执行后返回的是undefined,所以尝试对undefined调用.then()就会抛出Cannot read property 'then' of undefined的错误。
方案一:将admin改造为返回Promise的函数
如果你想继续使用Promise链式调用的写法,可以把admin函数重构为返回Promise的形式:
exports.admin = function(req, res) { return new Promise((resolve, reject) => { if(!req.user) { const err = new Error('No Valid User'); err.status = 403; reject(err); } else if(!req.user.admin) { const err = new Error('You must be an administrator!'); err.status = 403; reject(err); } else { console.log('IN'); resolve(); // 验证通过,触发后续的.then逻辑 } }) }
然后在调用时,记得添加.catch()来捕获错误并传递给Express的错误处理中间件:
routerA.route('/').post( (req,res,next)=> { authenticate.admin(req, res) .then(()=>{ // 这里写验证通过后的业务逻辑 }) .catch(err => next(err)); // 将错误交给Express处理 })
方案二:使用Express原生中间件模式(更推荐)
其实你的admin函数本身就是标准的Express中间件,完全不需要手动调用再用Promise链式处理,直接把它作为中间件传入post方法即可:
routerA.route('/').post(authenticate.admin, (req,res,next)=> { // 这里已经是验证通过后的逻辑,无需再用.then // 你的业务代码写在这里 })
这种方式更符合Express的设计理念:中间件会按顺序执行,admin里的next()会自动调用后面的处理函数;如果验证失败,next(err)会直接触发Express的错误处理流程,不需要额外的Promise处理。
为什么原代码会出错?
你原代码里的admin函数返回的是next()的执行结果,但Express的next函数调用后返回的是undefined——所以你执行authenticate.admin(req, res, next)得到的是undefined,自然无法调用.then()方法。
内容的提问来源于stack exchange,提问作者mybirthname
相关产品推荐
相关产品推荐

