2017-04-10 68 views
7

假設我有12 async/await函數,並且在第12個函數中,發生錯誤。現在,我有這樣的代碼來捕獲所有的錯誤:如何在使用async/await時獲取完整的Node.js堆棧跟蹤?

process.on('unhandledRejection', function { 
    console.error(err); 
    process.exit(1); 
}); 

的問題是,沒有返回堆棧跟蹤:

ReferenceError: sdfg is not defined 
- get.js:29 Fruit.module.exports [as get] 
    /project/models/fruit/get.js:29:2 
- next_tick.js:129 process._tickDomainCallback 
    internal/process/next_tick.js:129:7 

在其他項目上,當我用回調與結構:

function doSomething(err, done) { 
    if (err) { return done(err); } 
    /* do something */ 
    return done(null, true); 
} 

然後我有一個很好的堆棧跟蹤錯誤發生的地方和那裏的步驟。現在用async/await我已經嘗試在各種級別捕捉錯誤,沒有結果。我也嘗試longjohnstackup - 我仍然只得到拋出錯誤的最後一個函數。

幫助 - 如何查看完整的堆棧?捕捉嵌套異步/等待錯誤的正確方法是什麼?

編輯:(一個完整的例子)

const getA = async() => { 
    await getB(); 
} 

const getB = async() => { 
    await getC(); 
    sdgf(); 
} 

const getC = async() => {} 

const start = async() => { 
    await getA(); 
} 

start().then().catch(e => console.error(e)); 

回答

1

unhandledRejection錯誤處理程序可能不是試圖抓住所有這些正確的方式。我建議你的包裹異步/在​​等待着try/catch塊:

async function doSomething() { 
    try { 
    await doSomethingElse() 
    } catch(err) { 
    console.log(err) 
    } 
} 

這應該給你一個更好的堆棧跟蹤。

+0

這是什麼,得到: \t的ReferenceError:sdfg不是在Fruit.module.exports [如GET]定義 \t(/models/fruit/get.js:29:2) \t在process._tickDomainCallback (internal/process/next_tick.js:129:7) –

+0

@JohnDerring看起來像一個堆棧跟蹤,說sdfg沒有在果實模型的第29行定義。我錯過了什麼? –

+0

獲得此功能之前的其他11個功能?換句話說,完整的堆棧跟蹤...? –

相關問題