2017-08-03 49 views
1

我有一個稱爲內部函數執行一系列asinc操作:如何將調用者詳細信息添加到node.js中的錯誤堆棧跟蹤中?

function inner(input) { 
    return step1(input) 
    .then(step2) 
    .then(step3) 
    .catch((e) => { 
     throw e 
    }) 
} 

我重新拋出從內部錯誤,所以我可以處理在主叫方平的誤差。

下面是一個簡單的例子:

app.get('/', function(req, res){ 
    inner(req) 
    .then(result => { 
     res.render('foo', result) 
    }).catch((e) => { 
     res.render('error', e); 

     //eventually this would be changed to logger.error(e) 
     console.log(e); 
    }) 
}) 

的問題是,當我登錄錯誤的堆棧跟蹤僅顯示功能內,但不是調用文件。如果我想在代碼中使用這個函數兩次併發生錯誤,那麼我需要知道我的代碼的哪個部分調用了它。

如何將來電者信息添加到錯誤堆棧跟蹤?

回答

0

非標準功能

由於Error.prototype.stack文件標記它作爲一個非標準的功能,不同的平臺可能具有不同的行爲和格式。

的index.html

<!doctype html> 
<html> 
    <head> 
    <script src="inner.js"></script> 
    <script src="caller1.js"></script> 
    <script src="caller2.js"></script> 
    </head> 
    <body></body> 
</html> 

inner.js

function inner() { 
    return new Promise((resolve, reject) => { 
    reject(new Error('Oh no')) 
    }).catch(e => { throw e }) 
} 

caller1.js和:

例如,我與下列文件測試它在Chrome caller2.js

inner().catch(e => { console.log(e.stack) }) 

而導致控制檯

Error: Oh no 
    at Promise (setup.js:3) 
    at Promise (<anonymous>) 
    at inner (setup.js:2) 
    at caller1.js:1 
Error: Oh no 
    at Promise (setup.js:3) 
    at Promise (<anonymous>) 
    at inner (setup.js:2) 
    at caller2.js:1 

兩個inner()和呼叫者在堆棧跟蹤的顯示。

解決方法

在你的情況,你可以手動登錄它的調用者的catch()

如果代碼在瀏覽器中執行,請使用document.currentScript及其src屬性來獲取文件名。

編輯:在Node.js的

我測試了它的Node.js V8.1.2和inner()和來電均被顯示出來。

順便說一句,在document一個段落了我attection:

需要注意的是幀只對JavaScript 功能產生是很重要的。如果,例如,執行同步穿過稱爲cheetahify一個 C++附加功能,它本身調用JavaScript 函數,代表cheetahify呼叫的幀將不 存在於堆棧跟蹤

這可能是原因我們得到不一致的結果。

在任何情況下,恐怕您仍然需要手動記錄文件名,這取決於您如何導入和執行它們。

+0

在您評論「不同的平臺可能有不同的行爲和格式。」我意識到我忘了提及我對node.js –

+0

Node.js部分添加了興趣。 – Microloft