Как использовать Error.captureStackTrace в node.js

#node.js

#node.js

Вопрос:

В последнее время я прохожу через реализацию промежуточного программного обеспечения для глобальной обработки ошибок в node.js . Затем я наткнулся на эту ошибку.captureStackTrace(this,this.constructor).

Я проверил документацию узла и обнаружил, что — Создает свойство .stack для targetObject, которое при обращении возвращает строку, представляющую местоположение в коде, при котором была вызвана ошибка.captureStackTrace().

MDN Docs — поддерживает правильную трассировку стека для того, где была вызвана наша ошибка

appError.js Файл

 class AppError extends Error {
constructor(message, statusCode) {
super(message);

this.statusCode = statusCode;

 // Error.captureStackTrace(this, this.constructor);
}}
  

app.js Файл

 const AppError = require('./appError');
const express = require('express');
const app = express();

app.all('*', (req,res,next) => {
         const custErr = new AppError('Mentioned Route is not available on server','404');
         next();
})
  

Мои наблюдения, когда я пытался отладить код:

  1. Я обнаружил, что свойство .stack доступно для объекта custErr, хотя я прокомментировал ошибку.captureStackTrace(this, this.constructor) в appError.js файл.
  2. Я все еще не понимаю, как использовать Error.captureStackTrace()

Может кто-нибудь объяснить мне это?

Ответ №1:

Одна вещь, которую вам нужно понять, это то, что помимо экземпляров Error -классов, throw -statement также может выдавать другие типы. Рассмотрим это, например:

 function throwSomeObj() {
    throw {statusCode: 500};
}

try {
  throwSomeObj();
} catch(err) {
  console.log(err);
  console.log(err.stack);
}  

Генерируемое исключение выдает объект, который вы ему передали, т. Е. {statusCode: 500} . Теперь, как вы можете видеть, у этого объекта нет никакой трассировки стека, поскольку undefined он зарегистрирован.

Однако вы можете использовать Error.captureStackTrace для захвата трассировки стека, где вы выдаете ошибку. Рассмотрим это:

 function throwObjWithStacktrace() {
    const someError = {statusCode: 500}
    Error.captureStackTrace(someError)
    throw someError;
}


try {
    throwObjWithStacktrace();
} catch (err) {
    console.log(err);
    console.log(err.stack);
}  

Как вы можете видеть, теперь err содержит свойство stack и содержит стек для функции, в которой была вызвана ошибка.

Обратите внимание, что при создании экземпляра нового Error -объекта стек будет автоматически установлен для этого объекта.

Комментарии:

1. Спасибо! Я понял концепцию. Но, как вы сказали, при создании экземпляра нового объекта Error (custErr) для этого объекта автоматически устанавливается стек, в таком случае, почему нам нужно использовать Error.captureStackTrace(this, this.constructor) в файле AppError ? Мы даже можем напрямую получить доступ к трассировке стека ошибок, используя custErr.stack.

2. Хорошо, теперь не понял! Причина использования Error.captureStackTrace(this, this.constructor) в классе AppError заключается в том, что трассировка стека не должна содержать вызов конструктора. Идеально! Ты показал мне путь @eol

Ответ №2:

Вы можете добавить это в свой файл package.json.

 "scripts": {
"test": "echo "Error: no test specified" amp;amp; exit 1",
"start": "nodemon --experimental-modules --es-module-specifier-resolution=node index.js"
},
  

Ответ №3:

Итак, сегодня я получил эту ошибку, поэтому вам нужно выполнить следующие шаги.

прежде всего, отключите свои порты с помощью npx kill-port 8000, смотрите это

  1. убедитесь, что вы установили все зависимости.(переустановите их)
  2. В моем случае я переустановил все зависимости.
  3. и если ошибка все еще сохраняется, переустановите узел. посмотрите на это сейчас, выполнив все шаги

Ответ №4:

В моем случае я установил неправильный путь, поэтому узел не нашел правильный путь, и то, что я сделал, было:

  1. Переместил мою папку src в папку моего сервера.
  2. Снова выполняется узел: узел src / server.mjs
  3. Готово, сервер запущен.