【问题标题】:Unhandled promise rejection in Node.jsNode.js 中未处理的承诺拒绝
【发布时间】:2017-06-04 19:19:28
【问题描述】:

我正在尝试拨打DELETE 并正在实现以下功能。我知道在一个承诺中,需要有一个“解决”和一个“拒绝”状态,但我收到了一个未处理的承诺拒绝错误:

UnhandledPromiseRejectionWarning:未处理的承诺拒绝(拒绝 id:1):[object Object]

我真的不喜欢在 Promise 中使用条件语句,因为它会变得混乱,但我在这里要做的是检查组织是否经过验证,如果是,则不应发生删除操作并且会拒绝。

function deleteOrg(id) {
    return new Promise((resolve, reject) => {
        // A helper function that returns an 'org' object
        findById(id)
        .then((orgObject) => {
            if (orgObject.verified_at !== null) {
                throw new Error(422, 'Unable to delete organization')
            }

            //Organization is not verified, so proceed to delete
            new Organization().where({'id': id}).destroy()
            .then(() => {
                return resolve() //return 200 upon deletion
            })
            .catch((err) => {
                return reject(new Error(500, 'Unable to delete organization'))
            })
        })
        .catch((err) => {
            const m = `Unable to delete organization: ${err.message}`
            return reject(new Error(500, m))
        })
    })
}

我很确定我在处理 if 中的拒绝错误。

【问题讨论】:

  • 正如@JaromandaX 所说!既然findById 返回Promise,为什么还需要Promise 构造函数?你可以then 这是结果。
  • @JaromandaX 感谢您分享我的链接 :-)
  • 未处理的拒绝是否有任何类型的堆栈跟踪?
  • @Bergi - 我经常看到它,我不得不:p

标签: javascript node.js ecmascript-6 promise


【解决方案1】:

在 Promise 构造函数中创建 Promise 是 known anti-pattern。尝试将您的 Promise 模块化为单独的函数:

function deleteOrg(id) {

  const verifyOrg = (orgObject) => {
    if (orgObject.verified_at !== null) {
      throw new Error(422, 'Unable to delete organization')
    }
  };

  const destroyOrg = () => new Organization().where({
    'id': id
  }).destroy();

  return findById(id)
    .then(verifyOrg)
    .then(destroyOrg);
}

您可以让错误通过承诺链传播并在外部处理它们:

deleteOrg(id)
  .catch((err) => {
    const m = `Unable to delete organization: ${err.message}`;
    // ...
  });

【讨论】:

  • 这看起来是一种更简洁的方式来处理承诺。但是,我仍然收到相同的未处理承诺拒绝错误。
【解决方案2】:

由于 findById 和 .destroy 返回 Promises,所以不需要 Promsie 构造函数

然后您的代码被简化为

function deleteOrg(id) {
    return findById(id)
    .then((orgObject) => {
        if (orgObject.verified_at !== null) {
            throw new Error(422, 'Unable to delete organization')
        }

        //Organization is not verified, so proceed to delete
        return new Organization().where({'id': id}).destroy()
        .catch((err) => {
            throw (new Error(500, `Unable to delete organization: ${err.message}`));
        });
    });    
}

【讨论】:

  • 不幸的是,这似乎不起作用 - 我仍然收到相同的未处理承诺拒绝错误:/
  • 你是怎么调用deleteOrg的?
  • 原来我调用 deleteOrg 是错误的。感谢您帮助我追踪它。
猜你喜欢
  • 2018-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-05
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
相关资源
最近更新 更多