如何获取Node中调用函数的文件名和行号?

时间:2015-02-20 14:25:49

标签: javascript node.js

在Python中工作时,我总是有这个简单的实用程序函数,它返回调用函数的文件名和行号:

from inspect import getframeinfo, stack
def d():
    """ d stands for Debug. It returns the file name and line number from where this function is called."""
    caller = getframeinfo(stack()[1][0])
    return "%s:%d -" % (caller.filename, caller.lineno)

所以在我的代码中,我只是简单地放了几个这样的调试行,看看在发生错误之前我们得到了多远:

print d()
# Some buggy code here
print d()
# More buggy code here
print d(), 'here is the result of some var: ', someVar

这对我来说非常有用,因为它确实有助于快速调试。

我现在正在寻找节点后端脚本中的等价物。我在寻找,但我找不到任何有用的东西(也许我在寻找错误的词语?)。

有没有人知道如何创建一个Javascript / nodejs函数,该函数输出调用函数的文件名和行号?欢迎所有提示!

3 个答案:

答案 0 :(得分:8)

您可以创建一个错误来获取错误所在的位置及其堆栈跟踪。然后你可以把它放到一个函数中,以获得它所在的行。

function thisLine() {
  const e = new Error();
  const regex = /\((.*):(\d+):(\d+)\)$/
  const match = regex.exec(e.stack.split("\n")[2]);
  return {
    filepath: match[1],
    line: match[2],
    column: match[3]
  };
}

console.log(thisLine());

This works for me in Google Chrome

And also in node

注意@ j08691的评论:

thisthis似乎都在使用lineNumber,这在NodeJS中不存在(据我所知)。

答案 1 :(得分:0)

我发现获取与行号相关的任何内容的唯一方法是捕获window.onerror函数,并且当出现错误消息时,将传递错误消息,即文件URL和行号:

window.onerror = function(msg, url, line) {
    alert(msg + "\n" + url + ":" + line);
};

这适用于Chrome浏览器 - 我不了解其他浏览器。

编辑这个答案是在2月份给出的。 15问题中有没有提及的NodeJS。这只是在11月和17日增加的。

答案 2 :(得分:0)

您可以使用此gulp插件gulp-log-line。它记录文件和行号,而无需读取堆栈的额外费用。

你只需要使用安装gulp和gulp-log-line npm install gulp --savenpm install gulp-log-line命令。之后,您需要在gulpfile.js中创建并编写以下代码并运行 gulp log-line在构建文件夹中创建重复文件: -

var gulp = require('gulp');
var logLine = require('gulp-log-line');
gulp.task('line-log', function() {
  return gulp.src("file.js", {buffer : true})
//Write here the loggers you use.
    .pipe(logLine(['console.log', 'winston.info']))
    .pipe(gulp.dest('./build'))

})

gulp.task('default', ['line-log'])

实施例

file.js: -

console.log('First log')
var someVariable
console.log('Second log')

变为

console.log('file.js:1', 'First log')
var someVariable
console.log('file.js:3', 'Second log')