Javascript 在抛出错误的情况下,如何有效地自动记录最后一个函数(在src代码中)的参数?
当我查看实时服务器错误并查看堆栈跟踪时,我几乎不知所措 例如,Firebase云函数堆栈跟踪可以将我指向发生错误的函数名和文件 在Object.exports.functionName(/user\u code/lib/routes/file.js:98:11) 尽管有时在不知道请求中传递的大型对象出了什么问题的情况下,这些错误很难在本地重现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
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。