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

问题描述 投票:0回答:4

我正在尝试拨打

DELETE
电话,并且正在实现下面的功能。我知道在承诺中,需要有“解决”和“拒绝”状态,但我收到了未处理的承诺拒绝错误:

UnhandledPromiseRejectionWarning:未处理的 Promise 拒绝(拒绝 id:1):[object 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))
        })
    })
}

我很确定我在

if
中处理拒绝的方式是错误的。

javascript node.js ecmascript-6 promise
4个回答
0
投票

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

0
投票

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

0
投票
original method() => {
             try{ //code to raise the exceptio


            })

;

最好的处理方式是使用

expect
可以匹配异常。样本测试

  someMock.mockFunc(() => {
          throw new Error("Something");
        });

   test('MockFunc in error', () => {
     return expect(orginalCall()).rejects.toMatch('Something');
   });

0
投票

我实际上遇到了同样的问题,因为我未能将

return
关键字添加到调用方法(deleteOrg(id))。添加
return
UnhandledPromiseRejectionWarning 后消失了。

function deleteOrg(id)
{
// actually returns a promise 
}

return deleteOrg.then((result) => { 
   //code logic after deleting the record// 
});
© www.soinside.com 2019 - 2024. All rights reserved.