网站搜索

javascript - 在抛出错误的情况下,我如何能够自动有效地记录最后一个函数(在源代码中)的参数?


当我查看实时服务器错误并查看堆栈跟踪时,我几乎束手无策。

例如,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 的函数控制台会在某个级别停止并显示“[object object]”。

所以我甚至可能会专门创建一个新项目来保存这些错误,并创建一个浏览器应用程序,让我可以直接在 Chrome 控制台中打开/玩这个对象。(因为你可以在那里不断展开对象)。

我觉得这是一个非常常见的问题,并且已经存在解决方案,希望有人能指引我找到它们。

问题:在抛出错误的情况下,我如何能够自动有效地记录最后一个函数(在源代码中)的参数?

答案#1

在一个 Node 应用程序中,你可以定义一个 __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;
    }
});

然后在 logger 模块中你可以这样调用它:

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")
            );