我在Mocha测试中收到“未处理的拒绝”消息,但由于这个问题是异步发生的,所以我不知道问题的确切根源是什么。
我知道我可以为全局unhandledRejection事件添加一个事件侦听器,例如:
process.on('unhandledRejection', function(reason) {
console.error(reason);
process.exit(1);
});
但这并没有真正的帮助,因为跟踪如下:
{ Error: ENOENT: no such file or directory, open '/tmp/testfile.json'
at Error (native)
cause:
{ Error: ENOENT: no such file or directory, open '/tmp/testfile.json'
at Error (native)
errno: -2,
code: 'ENOENT',
syscall: 'open',
path: '/tmp/testfile.json' },
isOperational: true,
errno: -2,
code: 'ENOENT',
syscall: 'open',
path: '/tmp/testfile.json' }
问题与节点的内置处理程序相同。没有回溯。
显然我没有得到正确的回溯,因为拒绝发生在本机fs模块中。 如果我尝试仅运行发生此跟踪的测试,则根本不会发生。可能是因为在“较早”的某个地方建立了一个失控的承诺。在测试代码或实际实现代码中的任何地方都不存在指定的/ tmp /路径。 testfile.json确实存在,但不在该路径中。
我正在使用节点6.5.0运行mocha 3.5.3。
那么问题是:如何缩小范围以查找有问题的代码?
答案 0 :(得分:1)
我不确定是否会有所帮助,但是您也可以从Promise
侦听器获取unhandledRejection
作为参数,以获取更多有用的输出。文件here
process.on('unhandledRejection', (reason, p) => {
console.log('Unhandled Rejection at:', p, 'reason:', reason);
// application specific logging, throwing an error, or other logic here
});
答案 1 :(得分:0)
一种通用方法。将问题一分为二:
然后继续平分引起问题的特定文件。注释掉代码,直到不执行有问题的代码。