การค้นหาแหล่งที่มาของการปฏิเสธสัญญาที่ไม่สามารถจัดการได้: TypeError: ตรวจพบวงจรการผูกมัดสำหรับสัญญา


11

ฉันพยายามค้นหาแหล่งที่มาของการปฏิเสธที่ไม่มีการจัดการจาก Promise ใน Node.js

ฉันได้ลองอัพเกรดเป็น Node เวอร์ชัน 12 โดยใช้--async-stack-tracesตัวเลือกและฟังโดยใช้:

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การปฏิเสธที่ไม่สามารถจัดการได้จะมีคำเตือนว่าคุณสามารถติดตามได้
Karen Grigoryan

คำตอบ:


2

หากคุณพลาด stacktrace ที่มีประโยชน์คุณสามารถทำให้ node สร้างโหนดใหม่ได้โดยการโยนข้อผิดพลาดของคุณในตัวจัดการของคุณดังนี้:

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

ด้วยวิธีนี้คุณจะสามารถติดตามผู้กระทำผิดได้


ฉันลองใหม่อีกครั้งและก็ใช้งานได้จริง
Gomino

@d -_- b คุณสามารถทดสอบสิ่งนี้ได้หรือไม่?
Gomino

สวัสดี @Gomino ใช่ แต่น่าเสียดายที่มันไม่ได้ทำงานในสถานการณ์ของฉัน แต่ฉันขอขอบคุณที่คุณช่วยที่นี่!
d -_- b

0

ขอบคุณสำหรับคำแนะนำทั้งหมด. ฉันลองอีกครั้งโดยอัปเกรดเป็นโหนดล่าสุด12.14.1และในที่สุดก็สามารถทำให้แสดงการติดตามสแต็กได้:

ฉันใช้node --async-stack-traces myScript.jsร่วมกับ:

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

และมันติดตามข้อผิดพลาด


โหนด 12 ไม่บันทึกเหตุผลการปฏิเสธที่ไม่ได้จัดการแม้ว่าจะไม่มีตัวจัดการเหตุการณ์นั้นก็ตาม
Bergi

คุณยังไม่ลองใช้วิธีแก้ปัญหาที่ฉันให้ไว้เหรอ?
Gomino

-1

ในการค้นหาสแต็คการติดตามที่ดีสำหรับรหัสนี้ const cyclic = Promise.resolve().then(() => cyclic); ฉันใส่รหัสนี้ลงในไฟล์prromise_cycle.jsและเรียกใช้กับผู้ตรวจสอบเพื่อทำการดีบั๊ก

ฉันตรวจแก้จุดบกพร่องบน Chrome DevTools ที่Pause on caught exceptionsเปิดใช้งานการตั้งค่าสถานะจากนั้นฉันสามารถดูการติดตามสแต็กทั้งหมดด้วยไฟล์ของฉัน

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.