Как добавить информацию о вызывающем абоненте в трассировку стека ошибок в node.js?

1

У меня есть функция, называемая inner, которая выполняет ряд операций asinc:

function inner(input) {
    return step1(input)
    .then(step2)
    .then(step3)
    .catch((e) => {
        throw e
    })
}

Я перевернул ошибку изнутри, чтобы я мог обработать ошибку на уровне вызывающего абонента.

Вот простой пример:

app.get('/', function(req, res){
    inner(req)
    .then(result => {
        res.render('foo', result)
    }).catch((e) => {
        res.render('error', e);

        //eventually this would be changed to logger.error(e)
        console.log(e);
    })
})

Проблема в том, что когда я регистрирую ошибку, трассировка стека показывает только внутреннюю функцию, но не файл вызывающего. Если бы я дважды использовал эту функцию в своем коде и возникла ошибка, тогда мне нужно было знать, какая часть моего кода вызвала ее.

Как добавить информацию о вызывающем абоненте в трассировку стека ошибок?

Теги:
error-handling
promise

1 ответ

0

Нестандартная функция

Поскольку документ Error.prototype.stack его как нестандартную функцию, разные платформы могут иметь разные Error.prototype.stack поведения и форматы.

Например, я протестировал его в Chrome со следующими файлами:

index.html

<!doctype html>
<html>
  <head>
    <script src="inner.js"></script>
    <script src="caller1.js"></script>
    <script src="caller2.js"></script>
  </head>
  <body></body>
</html>

inner.js

function inner() {
  return new Promise((resolve, reject) => {
    reject(new Error('Oh no'))
  }).catch(e => { throw e })
}

caller1.js и caller2.js

inner().catch(e => { console.log(e.stack) })

И результат в консоли:

Error: Oh no
    at Promise (setup.js:3)
    at Promise (<anonymous>)
    at inner (setup.js:2)
    at caller1.js:1
Error: Oh no
    at Promise (setup.js:3)
    at Promise (<anonymous>)
    at inner (setup.js:2)
    at caller2.js:1

И inner() и вызывающие отображаются в трассировке стека.

Временное решение

В вашем случае вы можете вручную зарегистрировать его в catch().

Если код выполнен в браузере, используйте document.currentScript и его свойство src чтобы получить имя файла.

Изменение: в Node.js

Я протестировал его в Node.js v8.1.2, а также отобразились inner() и вызывающие.

Кстати, абзац в документе получил мое отношение:

Важно отметить, что фреймы генерируются только для функций JavaScript. Если, например, выполнение синхронно проходит через функцию C++ аддона, называемую cheetahify, которая сама вызывает функцию JavaScript, кадр, представляющий вызов cheetahify, не будет присутствовать в трассировке стека

Это может быть причиной того, что мы получаем противоречивые результаты.

В любом случае, я боюсь, вам все равно придется вручную регистрировать имя файла, что зависит от того, как вы импортируете и выполняете их в первую очередь.

  • 0
    После того, как вы прокомментируете, «разные платформы могут иметь разное поведение и форматы». Я понял, что забыл упомянуть, что меня интересует node.js
  • 0
    Часть Node.js добавлена.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню