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 でメソッド名と行の参照を取得する方法はありますか?

4

1 に答える 1

7

アプリケーションロガーで使用する優れたモジュールがあります。行番号を取得することもできます。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
于 2013-05-23T12:12:54.773 に答える