You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:41:59