2017-09-22 21 views
1

我的應用程序有許多模塊,並使用承諾所有的地方。承諾拒絕「......沒有定義」,我怎麼找到源

有時,深藏在這些模塊中的一個,我的代碼拋出一個異常 和承諾鏈條被拒絕。如果這個錯誤是可重現的,我可以單步執行,直到找到異常爲止。但事實並非如此。

我怎麼到的NodeJS產生回溯,以確定有罪的模塊,功能和代碼行?

這是一個簡單的例子。

'use strict'; 

// pretend multiple modules, each with deep complicated chains of Promises 
Promise.resolve() 
    .then(() => { return Promise.resolve() }) 
    .then(() => { return Promise.resolve() }) 
    .then(() => { return Promise.resolve() }) 
    .then(() => { 
     x = "find me if you can, x is very common variable name"; 
     return Promise.resolve 
    }) 
    .then(() => { return Promise.resolve() }) 
    .then(() => { return Promise.resolve() }) 
    .catch((e) => { console.log("where did you come from " + e) }) 

從上述的輸出是「你在哪裏來自的ReferenceError:X是未定義」

+0

僅供參考,'return Promise.resolve'沒有意義,因爲那只是返回一個函數引用。也許你的意思是'返回Promise.resolve()'。另外,你也可以直接做'返回值',這是毫無意義的。 – jfriend00

+0

使用,這將捕捉拒絕承諾的堆棧蹤跡[藍鳥承諾(http://bluebirdjs.com/docs/api-reference.html)庫。除此之外,通常情況下,在拒絕發生的地方縮小範圍的方法是將'.catch()'語句記錄到更接近拒絕來源的地方。 '.catch(ERR => {的console.log( 「有用的東西」,ERR);拋ERR;});' – jfriend00

+0

jfriend00,良好的抓。我會更新這個例子。我的例子通過在Promise.resolve中包裝的automaticaly中的任何東西的副作用來工作。因此,我的示例返回已解決的承諾,該函數的參數用於生成解決承諾。 – grabbag

回答

0

一種可能的解決方案將是使對承諾的分解器的包裝,它接受一個拒絕消息。

const resolver = (resolveItem, rejectMessage) => { 
    return Promise 
    .resolve(resolveItem) 
    .catch(err => Promise.reject({...err, myMessage: rejectMessage})) 
} 

Promise.resolve() 
.then(() => { return resolver(function1(a, b, c), "1") }) 
.then(() => { return resolver(function2(a, b, c), "2") }) 
.then(() => { return resolver(function3(a, b, c), "3") }) 
.catch((e) => { console.log("I came from " + e.myMessage) }) 
+0

這需要包裝每個承諾。與每一個承諾都有所不同。我希望能有一些全局的東西來告訴nodejs,而不是把一個異常變成一個帶有小祕密信息的拒絕,並創建一個回溯。 – grabbag

+0

'Bluebird'有它http://bluebirdjs.com/docs/api/promise.longstacktraces.html – Prasanna

+0

我在doc發現以下。 ('unhandledRejection',(reason,p)=> { console.log('******未處理拒絕:',p'原因: ',原因); //特定於應用程序的日誌記錄,拋出錯誤或其他邏輯 }); – grabbag

相關問題