[英]V8 javascript: chrome vs node.js - differences in 'this' context
[英]Accessing line number in V8 JavaScript (Chrome & Node.js)
花時間使用 C 等語言的 JavaScript 開發人員通常會錯過使用某些類型的內省的能力,例如記錄行號以及調用當前方法的方法。 好吧,如果您使用的是 V8(Chrome、Node.js),則可以使用以下方法。
Object.defineProperty(global, '__stack', {
get: function(){
var orig = Error.prepareStackTrace;
Error.prepareStackTrace = function(_, stack){ return stack; };
var err = new Error;
Error.captureStackTrace(err, arguments.callee);
var stack = err.stack;
Error.prepareStackTrace = orig;
return stack;
}
});
Object.defineProperty(global, '__line', {
get: function(){
return __stack[1].getLineNumber();
}
});
console.log(__line);
以上將記錄19
。
與arguments.callee.caller
結合使用,您可以更接近於通過宏在 C 中獲得的有用日志記錄類型。
已接受的答案 IMO 的問題在於,當您想打印某些內容時,您可能正在使用記錄器,而在這種情況下,使用已接受的解決方案將始終打印同一行:)
一些小的改變將有助於避免這種情況!
在我們的例子中,我們使用 Winston 進行日志記錄,因此代碼如下所示(注意下面的代碼注釋):
/**
* Use CallSite to extract filename and number, for more info read: https://v8.dev/docs/stack-trace-api#customizing-stack-traces
* @returns {string} filename and line number separated by a colon
*/
const getFileNameAndLineNumber = () => {
const oldStackTrace = Error.prepareStackTrace;
try {
// eslint-disable-next-line handle-callback-err
Error.prepareStackTrace = (err, structuredStackTrace) => structuredStackTrace;
Error.captureStackTrace(this);
// in this example I needed to "peel" the first CallSites in order to get to the caller we're looking for
// in your code, the number of stacks depends on the levels of abstractions you're using
// in my code I'm stripping frames that come from logger module and winston (node_module)
const callSite = this.stack.find(line => line.getFileName().indexOf('/logger/') < 0 && line.getFileName().indexOf('/node_modules/') < 0);
return callSite.getFileName() + ':' + callSite.getLineNumber();
} finally {
Error.prepareStackTrace = oldStackTrace;
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.