2020年12月10日 星期四

nodejs express 非同步錯誤處理的error傳遞

情境

route main內執行 child()

child為非同步

非同步的child function可以是


1.以async宣告
const asyncFun = async(res) => {
  await sleep(2000)
  const result = JSON.parse(body)
  return result
}
2.以Promise宣告
const promiseFun = (res) => {
  return new Promise((resolve, reject) => {
    try {
      const result = JSON.parse(body)
      resolve(result)
    } catch (e) {
      reject(e)
    }
  })
}

如果child function內沒有使用try catch包裹

發生錯誤就會是往呼叫端(main)的catch丟
如果呼叫端(main)也沒有用try catch或是asyc 的catch攔截
錯誤就會往外 讓express的錯誤處理接收到

有一個特別的例外是當child內有使用setTimeout把執行的工作包裝起來
那麼當發生錯誤時
若在child內寫try catch是可以攔截到 但卻無法把錯誤往呼叫端丟
唯一可行的是child是使用promise寫 就可以在try catch攔截到錯誤
時呼叫reject回傳給呼叫端的catch

儘可能不要在child內直接處理res回應
否則當child發生錯誤 res回應的部份不被執行
可能造成系統掛掉

沒有留言: