簡體   English   中英

在 V8 JavaScript(Chrome 和 Node.js)中訪問行號

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM