2017-04-17 60 views
0

我正在構建一個接收webhook數據(shopify訂單)並將它們保存到關係型mysql數據庫的api。每個訂單都有屬於集合(類別)的產品。我將產品與集合關聯起來,或者如果它尚不存在,則創建一個新集合。我碰到的問題是,因爲我不能使用findOrCreate()我首先做一個find(),然後如果沒有找到,我做一個創建。然而,因爲nodejs是異步的,所以如果我立刻得到很多訂單,有時同一個集合不能同時被兩個不同的產品找到,然後在另一個嘗試之前創建它,所以當其他人嘗試創建水線會引發錯誤:Sailsjs錯誤處理與數據庫/水線錯誤

col_id •與col_id已存在的記錄(405145674)。

什麼是最好的方法來捕獲這個錯誤,所以我可以做另一個find(),所以函數返回適當的集合,而不是一個未定義?我可以這樣做:

if (err){ findmethodagain(); } 

但隨後它會嘗試任何錯誤,而不是一個「記錄與該ID已經存在」的錯誤。

+0

嘗試檢查某些唯一代碼或屬性對於此類錯誤是唯一的錯誤,並僅在此類代碼匹配時重試。 – Sangharsh

+0

@Sangharsh當我console.log它說錯誤是什麼問題,但我不知道如何得到錯誤的某些部分。我應該做一個err.search('存在col_id alreasy存在的記錄')還是相同的lodash? – hamncheez

+1

當錯誤被記錄時,只顯示'err.toString()'。檢查err的其他屬性,這些屬性沒有顯示,但在這裏很有用。例如。 err.toPOJO(),err.ValidationError,err.originalError,err.invalidAttributes – Sangharsh

回答

0

如果你沒有看到這麼多,延遲後再做第二次嘗試也不會有什麼壞處。例如,您可以使用Promise.delay(例如Bluebird)在出現任何錯誤後的幾毫秒後運行第二個函數。如果在大多數情況下他們中的一個創建集合,那麼只需一次重試即可成功。

如果您看到很多其他錯誤,那麼修復它們。

但是,競態條件通常表明您需要重新構建體系結構。我建議不要依賴錯誤屬性或試圖繞開它們,而是重新設計它,至少在需要創建新集合的情況下。一個普遍的選擇是建立一個工作隊列。在你的情況下,你只需在第一遍中使用find來查看是否存在一個集合,如果不存在,則將其啓動到隊列中以供單個工作人員依次選取。在工人的工作中,你的find然後創建。您可以使用RedisBull快速輕鬆地進行設置。