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

我试图做一个DELETE调用,我正在实现下面的function。 我明白,在一个承诺,需要有一个决心和拒绝的状态,但我得到一个未处理的承诺拒绝错误:

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

我不太喜欢在promise中使用条件语句,因为它会变得混乱,但是我在这里要做的是检查组织是否被validation,如果是的话,删除操作不应该发生并且会被拒绝。

 function deleteOrg(id) { return new Promise((resolve, reject) => { //A helper function that return 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错误的内部拒绝。

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

在承诺构造函数中创buildpromise是一种已知的反模式 。 尝试将您的承诺模块化为单独的function:

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