#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();
})
Мои наблюдения, когда я пытался отладить код:
- Я обнаружил, что свойство .stack доступно для объекта custErr, хотя я прокомментировал ошибку.captureStackTrace(this, this.constructor) в appError.js файл.
- Я все еще не понимаю, как использовать 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, смотрите это
- убедитесь, что вы установили все зависимости.(переустановите их)
- В моем случае я переустановил все зависимости.
- и если ошибка все еще сохраняется, переустановите узел. посмотрите на это сейчас, выполнив все шаги
Ответ №4:
В моем случае я установил неправильный путь, поэтому узел не нашел правильный путь, и то, что я сделал, было:
- Переместил мою папку src в папку моего сервера.
- Снова выполняется узел: узел src / server.mjs
- Готово, сервер запущен.