Javascript Node.js中未处理的承诺拒绝

Javascript Node.js中未处理的承诺拒绝,javascript,node.js,ecmascript-6,promise,Javascript,Node.js,Ecmascript 6,Promise,我正在尝试进行一个DELETE调用,我正在实现下面的函数。我理解在承诺中,需要有“解决”和“拒绝”状态,但我得到了一个未处理的承诺拒绝错误: 未处理的PromisejectionWarning:未处理的承诺拒绝(拒绝id:1):[object] 我真的不喜欢在承诺中使用条件语句,因为它会变得混乱,但我在这里尝试的是检查组织是否已验证,如果已验证,则不应执行删除操作并将其拒绝 function deleteOrg(id) { return new Promise((resolve, rej

我正在尝试进行一个
DELETE
调用,我正在实现下面的函数。我理解在承诺中,需要有“解决”和“拒绝”状态,但我得到了一个未处理的承诺拒绝错误:

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

我真的不喜欢在承诺中使用条件语句,因为它会变得混乱,但我在这里尝试的是检查组织是否已验证,如果已验证,则不应执行删除操作并将其拒绝

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))
        })
    })
}

如果错误,我很确定我正在处理
中的拒绝。

在承诺构造函数中创建承诺是一个非常困难的过程。尝试将您的承诺模块化为单独的功能:

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

正如findById和.destroy返回承诺一样,不需要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}`));
        });
    });    
}

避免像@JaromandaX所说的那样!既然
findById
返回了一个
Promise
为什么还需要
Promise
构造函数?你可以这样做。@JaromandaX谢谢你分享我的链接:-)有没有任何未处理拒绝的堆栈跟踪?@Bergi-我经常看到它,我不得不这样做:幸好这似乎不起作用-我仍然收到相同的未处理承诺拒绝错误:/What's calling deleteOrg?原来我是打错电话了。谢谢你帮我追查。这看起来是一个更干净的方式来履行承诺。但是,我仍然会收到相同的未处理的拒绝承诺错误。