Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在抛出错误的情况下,如何有效地自动记录最后一个函数(在src代码中)的参数?_Javascript_Typescript_Error Handling_Google Cloud Functions_Trace - Fatal编程技术网

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

Javascript 在抛出错误的情况下,如何有效地自动记录最后一个函数(在src代码中)的参数?,javascript,typescript,error-handling,google-cloud-functions,trace,Javascript,Typescript,Error Handling,Google Cloud Functions,Trace,当我查看实时服务器错误并查看堆栈跟踪时,我几乎不知所措 例如,Firebase云函数堆栈跟踪可以将我指向发生错误的函数名和文件 在Object.exports.functionName(/user\u code/lib/routes/file.js:98:11) 尽管有时在不知道请求中传递的大型对象出了什么问题的情况下,这些错误很难在本地重现 const requestData = { largeData: { thatIsNestedManyLevels: undef

当我查看实时服务器错误并查看堆栈跟踪时,我几乎不知所措

例如,Firebase云函数堆栈跟踪可以将我指向发生错误的函数名和文件

在Object.exports.functionName(/user\u 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..
}
const requestData={
大数据:{

这是嵌套的manylevels:undefined/在节点应用程序上,您可以定义一个
\u堆栈
对象,它将帮助您在记录器中获取完整的堆栈跟踪,如下所示:

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

不确定它是否能很好地与GCF配合使用,但您可以看看提供的选项。这似乎可行,但不可行。我设想两种方法:a)使用
window.onerror
;b)包装函数。前者不会提供有关调用方上下文的信息,因此这是一种不可能的方法。后者是关于包装你可以选择你的目标函数,这样你就可以在它们的上下文中捕捉它们,但这是一个相当复杂和麻烦的解决方案。我几乎100%确定,没有内置的方法。你可以从全局对象开始,尝试用代理之类的东西包装每个函数,但这似乎是不必要的复杂。你通常想要的是设置一个合适的日志系统,该系统将记录每个函数的参数以及其他重要信息,您可以将这些信息与堆栈跟踪一起使用来跟踪bug。