簡體   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