Как я могу эффективно регистрировать аргументы последней функции (в коде src) автоматически в случае возникновения ошибки? - PullRequest
0 голосов
/ 01 февраля 2019

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

Например, трассировка стека облачных функций Firebase может указать мне имя функции и файл, в котором произошла ошибкапроизошло.

в Object.exports.functionName (/user_code/lib/routes/file.js:98:11)

Хотя иногда эти ошибки могут быть трудновоспроизводить локально, не зная, что пошло не так с большими объектами, передаваемыми в запросе.

const requestData = {
    largeData: {
         thatIsNestedManyLevels: undefined // <-- this undefined value causing server error and is hard to guess/reproduce locally 
    }
    // etc..
}

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

Я также знаю, что консоль функции firebase остановится на определенном уровне и выдаст «[объектный объект]».

Так что я могу даже посвятить новый проект сохранению этих ошибок и создать приложение для браузера, которое позволит мне просто открывать / играть с объектом в консоли Chrome.(поскольку вы можете продолжать разворачивать объект там).

Я чувствую, что это очень распространенная проблема и что решение для нее уже существует, и надеюсь, что кто-то может указать мне на них.

Вопрос: Как я могу эффективно регистрировать аргументы последней функции (в коде src) автоматически в случае возникновения ошибки?

1 Ответ

0 голосов
/ 08 февраля 2019

В приложении узла вы можете определить объект __stack, который поможет вам получить полную трассировку стека в логгере, например:

global.logger = require(path.join(__dirname, 'app_modules/logger'));
Object.defineProperty(global, '__stack', {
    get: function () {
        let orig = Error.prepareStackTrace;
        Error.prepareStackTrace = function (_, stack) {
            return stack;
        };
        let err = new Error;
        Error.captureStackTrace(err, arguments.callee);
        let stack = err.stack;
        Error.prepareStackTrace = orig;
        return stack;
    }
});

Затем в модуле логгера вы можете вызвать его какэто:

let logString = JSON.stringify({
                "Level": "Error",
                "LogErr": logEntry,
                "Stacktrace": __stack,
                "at": __stack[1].getFileName() + ":" + __stack[1].getLineNumber() + ":" + __stack[1].getColumnNumber()
            }, null, 4);
            process.stderr.write(
                logString.replace(/\\n/g, "\n")
            );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...