繁体   English   中英

Node.js中未处理的promise拒绝

[英]Unhandled promise rejection in Node.js

我正在尝试进行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错误的拒绝。

在promise构造函数中创建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);
}

在哪里可以让错误通过promise链传播并在外部处理它们:

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

当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}`));
        });
    });    
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM