如何在node.js中获取方法名称

8

场景:假设我有多个方法执行不同的任务,由不同的开发人员处理。我试图进行通用方法调用,以记录错误发生时的日志。因此需要记录行号、方法名等信息。

我编写了一个通用函数,如下所示:

  function enterLog(sourcefile, methodName, LineNo)
    {
            fs.appendFile('errlog.txt', sourcefile +'\t'+ methodName +'\t'+ LineNo +'\n', function(e){
            if(e)
                console.log('Error Logger Failed in Appending File! ' + e);
        });
    }

所以,调用上述方法需要传递源文件、方法名和行号。这些在开发过程中随时可能改变。
例如,调用带有硬编码值的方法:
enterLog('hardcodedFileName.js', 'TestMethod()', '27');

问题: 在Node.js中,是硬编码所需的值(如上例)更好,还是有任何方法可以获取方法名称和行号引用?


请查看这里的讨论:https://dev59.com/H3HYa4cB1Zd3GeqPNaDr(注意:此处只提供翻译文本,不提供链接访问) - NilsH
1个回答

7

有一个很好的模块我们在应用程序中使用 - logger。你甚至可以获取行号。https://npmjs.org/package/traceback

所以你可以这样重写它:

var traceback = require('traceback');

function enterLog(sourcefile, methodName, LineNo) {
  var tb = traceback()[1]; // 1 because 0 should be your enterLog-Function itself
  fs.appendFile('errlog.txt', tb.file +'\t'+ tb.method +'\t'+ tb.line +'\n', function(e) {
    if(e) {
      console.log('Error Logger Failed in Appending File! ' + e);
    }
  });
}

只需要调用:

enterLog();

您可以从任何地方进行操作,并始终获得正确的结果。

编辑:另一个提示。在没有第三方模块依赖的情况下,使用node.js不将文件名硬编码是最容易实现的方法:

var path = require('path');
var currentFile = path.basename(__filename); // where __filename always has the absolute path of the current file

不用谢。另一个提示与你的原始问题关系不大:请考虑将日志流入您的日志文件,因为fs.appendFile总是需要打开您的日志文件,向其写入内容并关闭文件句柄:http://nodejs.org/docs/latest/api/fs.html#fs_fs_createwritestream_path_options - hereandnow78
看起来这个例子出了点问题。我得到的是:/Users/chris/Desktop/Apps/repos/NetDb/Node.js/Node1/node_modules/traceback/lib/frame.js:26 frame.is_top = frame.isToplevel() ^ 非法访问。 - Chris Prince
这个回答已经超过2年了,所以自那时起 traceback 模块可能已经发生了变化... - hereandnow78

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接