Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/438.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从catch请求承诺堆栈跟踪_Javascript_Node.js_Promise_Bluebird_Es6 Promise - Fatal编程技术网

Javascript 从catch请求承诺堆栈跟踪

Javascript 从catch请求承诺堆栈跟踪,javascript,node.js,promise,bluebird,es6-promise,Javascript,Node.js,Promise,Bluebird,Es6 Promise,我目前正在使用“request-promise”库从node js调用API,并努力从“catch”函数获得正确的调用堆栈。玩了一会儿之后,我注意到一个有趣的行为,我无法解释。假设我有代码: .catch(err => { console.log(err.stack); console.log('!!!'); console.log(new Error().stack); }); 在控制台中,我实际上看到了“err”和“new Error()”两个完全不同的堆栈跟踪: Sta

我目前正在使用“request-promise”库从node js调用API,并努力从“catch”函数获得正确的调用堆栈。玩了一会儿之后,我注意到一个有趣的行为,我无法解释。假设我有代码:

.catch(err => {
  console.log(err.stack);
  console.log('!!!');
  console.log(new Error().stack);
});
在控制台中,我实际上看到了“err”和“new Error()”两个完全不同的堆栈跟踪:

StatusCodeError:404-[object]
在新的StatusCodeError(C:\MyProject\request promise\lib\errors.js:26:15)
at Request.RP$callback[as\u callback](C:\MyProject\Request promise\lib\RP.js:68:32)
at Request.self.callback(C:\MyProject\Request promise\node\u modules\Request\Request.js:187:22)
at Request.emit(events.js:110:17)
应要求。(C:\MyProject\request promise\node\u modules\request\request.js:1048:10)
at Request.emit(events.js:107:17)
在收到消息时。(C:\MyProject\request promise\node\u modules\request\request.js:969:12)
在IncomingMessage.emit(events.js:129:20)
at_stream_readable.js:908:16
在进程中调用(node.js:355:11)
!!!
错误
在C:/MyProject/src/server/controllers/bookingController.js:81:19
在tryCatcher(C:\MyProject\request promise\node\u modules\bluebird\js\main\util.js:26:23)
在Promise.\u settlePromiseFromHandler(C:\MyProject\request Promise\node\u modules\bluebird\js\main\Promise.js:510:31)
在Promise.\u SettlePromission(C:\MyProject\request Promise\node\u modules\bluebird\js\main\Promise.js:584:18)
在Promise.\u结算Promises(C:\MyProject\request Promise\node\u modules\bluebird\js\main\Promise.js:700:14)
在Async.\u drainQueue(C:\MyProject\request promise\node\u modules\bluebird\js\main\Async.js:123:16)
在Async.\u drainQueues(C:\MyProject\request promise\node\u modules\bluebird\js\main\Async.js:133:10)
在Immediate.Async.drainQueues[作为_onImmediate](C:\MyProject\request promise\node\u modules\bluebird\js\main\Async.js:15:14)
在processImmediate[as_immediateCallback](timers.js:367:17)
正如您所看到的,'newerror()'提供了有关调用堆栈的更多有用信息,因为它

'C:/MyProject/src/server/controllers/bookingController.js'

我猜这是因为“err”异常是用前面的记号创建的,因此它的堆栈跟踪与我的“bookingController.js”没有任何关系

另外,我看到“请求承诺”在内部使用“bluebird”,所以技术上我可以使用promise.longStackTraces()


最后,我的问题是:由于Promise.longStackTraces()对于生产来说性能太重,除了使用'new Error().stack'技巧之外,还有没有更聪明的方法来获得正确的堆栈跟踪

好的,nodejs提供了一种更漂亮的方法来捕获nodejs上的实际堆栈,这符合我的需要:

  let capturedStack = {};
  Error.captureStackTrace(capturedStack, writeStack);
  console.log(capturedStack.stack);

nodejs提供了一种更漂亮的方法来捕获nodejs上的实际堆栈,这符合我的需要:

  let capturedStack = {};
  Error.captureStackTrace(capturedStack, writeStack);
  console.log(capturedStack.stack);

当然,您会得到不同的堆栈跟踪,因为这两个错误是在非常不同的位置创建的?启用
longStackTraces()
会得到什么?是的,您可能应该使用它们-它们明确用于调试,您当然不会在生产环境中启用它们。@Bergi,真的吗?等等,我在问题中提到了。实际上,我希望得到一个答案:如何在没有丑陋的“new Error()”的情况下实现这一点。@Bergi我不能使用longStackTraces(),因为它意味着巨大的性能损失。如果您想获得错误处理程序的跟踪,而不是实际异常的跟踪,那么使用
new Error().stack
就是正确的选择(或者您使用创建漂亮的格式化堆栈跟踪的库之一)当然,您会得到不同的堆栈跟踪,因为这两个错误是在非常不同的位置创建的?使用
longStackTraces()可以得到什么
enabled?是的,您可能应该使用它们-它们明确用于调试,您当然不会在生产环境中启用它们。@Bergi,真的吗?哦,等等,我在我的问题中提到了这一点。实际上,我希望得到一个答案:如何在没有丑陋的“新错误()”的情况下实现这一点。@Bergi我不能使用longStackTraces()因为这意味着一个巨大的性能损失。如果您想获得错误处理程序的跟踪,而不是实际异常的跟踪,那么使用
new error().stack
正是正确的做法(或者您使用创建漂亮格式的堆栈跟踪的库之一)