2017-09-22 24 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

相关问题