【问题标题】:Promise warning after a mysql querymysql查询后的承诺警告
【发布时间】:2016-03-30 07:17:19
【问题描述】:

我是 nodejs 的新手。我有这个代码:

exports.index = function(req, res) {
  User.findAll({
    attributes: [
      '_id',
      'name',
      'email',
      'role',
      'provider'
    ]
  })
    .then(function(users) {
      res.status(200).json(users);
    })
    .catch(handleError(res));
};

function handleError(res, statusCode) {
  statusCode = statusCode || 500;
  return function(err) {
    res.status(statusCode).send(err);
  };
}

当它被执行时我收到了这个警告:

警告:在处理程序中创建了一个承诺,但没有从它返回

在 [object Object].Model.findAll (C:\aii\tema2-node\node_modules\sequelize\lib\model.js:1329:18)

你知道我为什么收到这个警告吗?

谢谢。

【问题讨论】:

  • 可以分享一下 User.findAll 和 handleError 吗?
  • 堆栈显示库是Sequelize

标签: javascript mysql node.js promise


【解决方案1】:

我认为你必须返回 User.findAll

exports.index = function(req, res) {
  return User.findAll({
    attributes: [
      '_id',
      'name',
      'email',
      'role',
      'provider'
    ]
  })
    .then(function(users) {
      res.status(200).json(users);
    })
    .catch(handleError(res));
};

【讨论】:

  • 我认为exports.index 是一个 Express 处理程序。
  • 没关系。 User.findAll 返回一个不返回的承诺。这就是错误的来源。
  • 从技术上讲,返回的是.then() 或catch() 的承诺。我在下面的回答中对它进行了更多解释,并进行了广义重构。
  • 无论如何他必须返回承诺以抑制警告。
【解决方案2】:

原代码有几个问题:

  1. 导出的函数不返回任何内容。调用者如何知道是否成功?

  2. .then() 处理程序不返回任何导致它的 promise 解析为 undefined 的值(请记住,then() 也返回一个 promise catch())。

    李>
  3. 即使模块函数返回了承诺链(如上面的答案),由于上述原因,它仍然会解析为undefined。

我很可能会将您的代码重构为类似于下面的伪代码。我假设您使用的是 express 之类的东西

 var User = require("<your User module>");
 //assuming app has been initialized...
 app.get("/users", (req,res) => {
       User.findAll({
                      attributes: [
                      '_id',
                      'name',
                      'email',
                      'role',
                      'provider']
                     })        
                     .then((users) => {
                         res.status(200).json(users); 
                     })
                     .catch((err) => {
                        //ideally send a generalized msg instead
                        res.status(500, {error: err } ); 
                     });
 });

这里没有 then() 或 catch() 返回的承诺的任何消费者,所以如果他们返回 undefined 没什么大不了的

【讨论】:

  • 你错了 .then 什么都不返回。它返回 undefined,promise 将完美解决。
  • 你是对的,你的例子中的代码肯定会解决。我指的是原始问题中的代码。此外,promise 应该代表最终值或错误。让它返回 undefined 没有多大意义(即使它符合规范),除非您在我的示例中没有承诺消费者的上下文中使用它。
猜你喜欢
  • 2019-06-10
  • 2014-05-22
  • 2020-01-01
  • 1970-01-01
  • 2019-05-22
相关资源
最近更新 更多