source

Node.js Unhandled Promise에서 처리되지 않은 약속을 찾는 방법거부 경고?

ittop 2023. 5. 12. 22:41
반응형

Node.js Unhandled Promise에서 처리되지 않은 약속을 찾는 방법거부 경고?

버전 7의 Node.js에는 약속을 처리하기 위한 비동기/대기 구문 당이 있으며 현재 내 코드에서는 다음과 같은 경고가 꽤 자주 나타납니다.

(node:11057) UnhandledPromiseRejectionWarning: Unhandled promise 
rejection (rejection id: 1): ReferenceError: Error: Can't set headers 
after they are sent.
(node:11057) DeprecationWarning: Unhandled promise rejections are 
deprecated. In the future, promise rejections that are not handled 
will terminate the Node.js process with a non-zero exit code.

안타깝게도 캐치가 빠진 라인에 대한 언급이 없습니다.모든 시도/캐치 블록을 확인하지 않고 찾을 수 있는 방법이 있습니까?

프로세스의 수신 이벤트입니다.

process.on('unhandledRejection', (reason, p) => {
  console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
  // application specific logging, throwing an error, or other logic here
});

처리되지 않은 ES6 Promise 거부에 대한 전체 스택 추적을 표시하는 올바른 방법은 다음을 사용하여 Node.js를 실행하는 것입니다.--trace-warnings플래그. 사용자 자신의 코드 내에서 거부를 가로챌 필요 없이 모든 경고에 대한 전체 스택 추적을 표시합니다.예:

node --vmdk-mdk app.js

다음을 확인합니다.trace-warnings플래그는 당신의 이름 앞에 옵니다..jsfile! 그렇지 않으면 플래그가 스크립트에 대한 인수로 해석되고 Node.js 자체에서 무시됩니다.

처리되지 않은 거부를 실제로 처리하려면(예: 로그를 기록하여) 내 모듈을 대신 사용하여 이를 지원하는 모든 주요 Promise 구현에 대해 처리되지 않은 거부를 단일 이벤트 핸들러로 모두 캡처할 수 있습니다.

그 모듈은 Bluebird, ES6 Promise, Q, WhenJS,es6-promise,then/promise처리되지 않은 거부 사양(문서의 전체 세부 정보)을 준수하는 모든 항목.

스택 추적을 사용한 로깅

더 유용한 오류 메시지를 찾고 있는 경우.노드 파일에 추가해 보십시오.충돌이 발생하는 전체 스택 추적을 표시해야 합니다.

process.on('unhandledRejection', (error, p) => {
  console.log('=== UNHANDLED REJECTION ===');
  console.dir(error.stack);
});

이 모듈을 통해 범인의 약속을 추적할 수 있었습니다. https://www.npmjs.com/package/trace-unhandled

  1. 설치하다

    npm i trace-unhandled
    
  2. 코드에 포함

    require('trace-unhandled/register');
    

@제레미 나도 같은 결과를 얻었습니다.reason가 제공하는 변수

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

정의되지 않았고 내 코드에 아무것도 제공하지 않는 약속 거부가 있었다는 것을 알아내는 데 시간이 걸렸습니다. 일반적으로 다음과 같습니다.

new Promise((resolve reject) => {
  const client = net.connect(options)
  client.on("connect", () => {
    resolve()
  })
  client.on("error", () => {
    reject()
  })
})

문제는 당신이reject아무것도 없이, 흔적을 얻으려면, 당신은 이와 같은 오류를 제공해야 합니다.

new Promise((resolve reject) => {
  const client = net.connect(options)
  client.on("connect", () => {
    resolve()
  })
  client.on("error", (err) => {
    reject(err)
  })
})

그리고 오류가 없으면 비어 있더라도 직접 하나를 제공할 수 있습니다. 스택 추적을 제공합니다.

reject(new Error())

오류가 발생한 위치를 찾아야 하는 경우 코드에서 다음을 찾습니다.Promise 거절로.

언급URL : https://stackoverflow.com/questions/43834559/how-to-find-which-promises-are-unhandled-in-node-js-unhandledpromiserejectionwar

반응형