使用Bookshelf.js开发Express接口时遇Promise未返回警告,该返回什么?
解决Promise未返回的警告问题
这个警告的核心原因是:你在Express路由处理器里创建了一个Promise(也就是Bookshelf.js的fetch()返回的对象),但没有把这个Promise返回给Express,导致Express无法追踪这个异步操作的完成状态,所以抛出了这个提示。
你的代码问题点
在getUser方法中,你调用了found_user.then().catch(),但整个Promise链没有被return出去——Express需要知道这个异步操作什么时候结束,否则它无法正确处理后续的请求生命周期,也可能导致潜在的内存泄漏或未捕获的错误。
修改方案
只需要把整个Promise链返回给Express即可,有两种写法:
写法1:直接返回Promise链
module.exports = { getUser: (req, res) => { // 关键:返回整个fetch()的Promise链 return User.query({where: {"email": req.body.email}, orWhere: {"username": req.body.email}}).fetch() .then(user => { if (user) { res.status(200).json(user) } else { res.status(422).json(new error.ERROR_422("No user found under username/email")); } }) .catch(err => { console.log(err) res.status(500).json(new error.ERROR_500(err)); }) } }
写法2:先赋值再返回(和写法1本质一致)
module.exports = { getUser: (req, res) => { var found_user = User.query({where: {"email": req.body.email}, orWhere: {"username": req.body.email}}).fetch() // 关键:返回整个Promise链 return found_user.then(user => { if (user) { res.status(200).json(user) } else { res.status(422).json(new error.ERROR_422("No user found under username/email")); } }) .catch(err => { console.log(err) res.status(500).json(new error.ERROR_500(err)); }) } }
更简洁的async/await写法
如果你的Node.js版本支持async/await(现在几乎所有主流版本都支持),可以改成这种更易读的写法——async函数会自动返回Promise,同样能解决警告问题:
module.exports = { getUser: async (req, res) => { try { const user = await User.query({where: {"email": req.body.email}, orWhere: {"username": req.body.email}}).fetch(); if (user) { res.status(200).json(user); } else { res.status(422).json(new error.ERROR_422("No user found under username/email")); } } catch (err) { console.log(err); res.status(500).json(new error.ERROR_500(err)); } } }
为什么这样能解决问题?
Express会识别路由处理器返回的Promise,等待它resolve或reject:
- 如果Promise resolve,Express知道异步操作完成,不会再提示未返回的Promise
- 如果Promise reject,Express会自动处理(不过你已经在catch里手动返回了500状态,所以这里完全没问题)
内容的提问来源于stack exchange,提问作者PowerLove
相关产品推荐
相关产品推荐

