Использование обещаний — ведение журнала трассировки стека в обработчике сбоев

Я новичок в nodejs, поэтому я объясню более подробно, что я пытаюсь сделать.

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

Например, функция обработки запросов:

var Q = require('q');

var requestHandler = function () {
    // Here I get the data etc. that was requested. As this is not important, just a dummy here
    Q.resolve()
        // Now I answer the request
        .then(function (data) {
            // Dummy Code representing the sending of a response
            console.log('sending response …');
            console.log('oh no! an exception');
            // Now an Exception occurs
            throw new Error('You did something wrong!');
        })
        // If there was any error, show the error page instead
        .fail(function (err) {
            // Dummy Code representing the sending of the error page
            console.log('sending error page');
            // Additionally I want to write the error into a log file
            console.error('You had an error: ', err);
        })
        // If there was an error in the .fail-handler, I deserve the server to crash
        .done();
};

// A request comes in, I want to call my handler
requestHandler();

Вывод консоли:

sending response …
oh no! an exception
sending error page
You had an error:  [Error: You did something wrong!]

Я не вижу способа получить доступ к трассировке стека. Но когда я выбрасываю исключение в .fail-handler (или просто опускаю полный .fail-handler), я получаю трассировку стека на консоли (но мне придется перезапустить сервер).

Итак, я думаю, мой вопрос:

Как получить доступ к трассировке стека в обработчике сбоев обещаний?

EDIT: Любые советы о том, как улучшить объяснение, конечно, приветствуются. Если я не ясно выразился, пожалуйста, дайте мне знать.


person dave    schedule 28.03.2013    source источник
comment
Вы не можете построить трассировку в javascript и вывести ее на клиент, а не просматривать на сервере?   -  person Beetroot-Beetroot    schedule 29.03.2013
comment
Как построить трассировку в javascript? Я бы предпочел записывать ошибки в файл журнала, а не показывать их посетителю веб-сайта.   -  person dave    schedule 29.03.2013


Ответы (1)


Регистрация объекта ошибки не будет печатать трассировку стека ошибки. Вы должны спросить об этом конкретно:

console.error('You had an error: ', err.stack);
person Mariusz Nowak    schedule 29.03.2013
comment
Спасибо Мариуш. почему этого нет в документации q? Это есть в документе, и я просто пропустил это? Примеры, которые они приводят, должны явно показывать это. - person Cheeso; 09.08.2013
comment
Cheeso, это обычный JavaScript, он не связан с Q. - person Mariusz Nowak; 09.08.2013
comment
Что ж, в моем случае это определенно связано с Q. Метод fail — это интерфейс Q, верно? И в случае сбоя он вызывается Q, верно? Разве Q не захочет задокументировать, что он отправляет и как метод обработчика отказа может это использовать? Это кажется очевидным кандидатом на пример в документе. - person Cheeso; 11.08.2013
comment
Это больше о том, как получить доступ к трассировке стека для объекта ошибки JavaScript. Q.fail никоим образом не изменяет объект ошибки, он просто передает его с первым аргументом точно так, как задокументировано. - person Mariusz Nowak; 12.08.2013
comment
При выполнении err.stack с исходными картами отображаются файлы .js, а не исходный файл. Есть ли другой способ заставить браузер записывать исходные файлы? - person Kevin Ghadyani; 06.12.2016