처리되지 않은 약속 거부 소스 찾기 : TypeError : 약속에 대한 체인주기가 감지되었습니다.


11

Node.js의 Promise에서 처리되지 않은 거부 소스를 찾으려고합니다.

--async-stack-traces옵션을 사용하여 노드 버전 12로 업그레이드 하고 다음을 사용하여 청취했습니다.

process.on("unhandledRejection",( reason, promise ) => {
  console.log(reason);
  console.log(promise);
});

그러나 여전히 범인을 찾는 데 도움이되는 유용한 스택 추적이 표시되지 않습니다!

UnhandledPromiseRejectionWarning: TypeError: Chaining cycle detected for promise #<Promise>
    at process._tickCallback (internal/process/next_tick.js:68:7)
(node:89675) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 11)

노드 v10.10.0 실행


여러 약속이 있습니까?
Prabhjot Singh Kainth

4
의 오류 당신의 당신이 것 같은 코드는, 순환 체인이다 const cyclic = Promise.resolve().then(()=>cyclic);, 그래서 처리되지 않은 약속 거부를 검색하지 않습니다이 하나의 노드의 내부 코드에있다.
Kaiido

1
문제를 제기하는 일부 코드가 도움이 될 것입니다.
x00

실행 npm i bluebird및 추가 const Promise = require('bluebird')코드에 당신에게 더 자세한 오류 메시지를 제공 할 수 있습니다
n3ko

와 노드를 실행하려고 --trace-warnings, 처리되지 않은 거부하면 추적 할 수 있다는 경고와 함께 동반
카렌 Grigoryan

답변:


2

유용한 스택 추적을 놓치면 다음과 같이 처리기에서 오류를 다시 발생시켜 노드를 새로 만들 수 있습니다.

process.on('unhandledRejection', (reason, p) => { throw reason });

이렇게하면 범인을 추적 할 수 있어야합니다.


나는 단지 내 편에서 다시 시도하고 확실히 작동합니다.
Gomino

@d -_- b 당신은 이것을 당신 편에서 테스트 할 수 있었습니까?
Gomino

안녕 @ 고 미노, 네 불행히도 그것은 내 시나리오에서 작동하지 않지만 여기에 귀하의 도움에 감사드립니다!
d -_- b

0

모든 제안에 감사드립니다. 최신 노드로 업그레이드하여 다시 한 번 시도했으며 12.14.1마침내 스택 추적을 표시 할 수있었습니다.

나는 다음 node --async-stack-traces myScript.js과 함께 사용 했다 :

process.on('unhandledRejection', (reason, p) => {
  console.log(reason);
});

그리고 오류를 추적했습니다.


이벤트 핸들러가 없어도 노드 12가 처리되지 않은 거부 이유를 기록하지 않습니까?
베르 기

내가 제공 한 솔루션을 사용해 보지 않았습니까?
Gomino

-1

이 코드에 대한 좋은 스택 추적을 찾으려면 const cyclic = Promise.resolve().then(() => cyclic); 이 코드를 파일에 넣고 prromise_cycle.js관리자와 함께 실행하여 디버깅하십시오.

플래그가 Pause on caught exceptions활성화 된 Chrome DevTools에서 디버깅 한 다음 파일이있는 전체 스택 추적을 볼 수 있습니다

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.