2013-05-22 26 views
10

関数の呼び出し元の絶対パスを取得する方法を知りたいですか?Nodejs:呼び出し元関数のファイル名を取得する

レッツは言う:

ファイル a.js私は b()を呼んで

b()は、ファイルb.jsで定義された関数です。 a.jsbが必要です。だから、ノードのb.jsからa.jsの絶対パスを取得するにはどうすればよいですか?

+1

も参照してくださいhttp://stackoverflow.com/questions/13227489/how-can-one-get-the-ノード内の呼び出し元関数のファイルパス- –

+0

また、http://stackoverflow.com/questions/10111163/in-node-js-how-can-i-get-the-pathも参照してください。 -of-a-module-i-have-loaded-via-require-that-is – basilikum

+0

私の答え[ここ](https://stackoverflow.com/a/44872310/52499)を参照してください。 –

答えて

16

これは、呼び出し元のファイルを見つけるために、スタックトレースを使用する方法の例ですノードに

function _getCallerFile() { 
    try { 
     var err = new Error(); 
     var callerfile; 
     var currentfile; 

     Error.prepareStackTrace = function (err, stack) { return stack; }; 

     currentfile = err.stack.shift().getFileName(); 

     while (err.stack.length) { 
      callerfile = err.stack.shift().getFileName(); 

      if(currentfile !== callerfile) return callerfile; 
     } 
    } catch (err) {} 
    return undefined; 
} 
+0

これは受け入れられた回答である必要があります:http://stackoverflow.com/a/29581862/11236 – ripper234

1

JavaScriptでスタックトレースを取得するのはかなり難しいです。私が見つけた最良の方法は、エラーを投げてキャッチし、Error.getStack()(すべてのブラウザでは実装されていない、つまりIEを意味する)からスタックを取得し、出力をフォーマットすることです。

各スタックフレームには、ファイルパス、行番号、および関数名が表示されます。 Webkitも引数をサポートしていますが、最後にチェックした時点ではまだ動作していませんでした。

次に、異なるイベント間でコードをトレースするという問題があります。

私は実際にこのことについてブログ記事を書いた:http://fritsvancampen.wordpress.com/2013/03/28/error-handling-in-javascript-a-better-way/

+0

{ 新しいエラーを投げてください。 } catch(e){ console.log(JSON.stringify(e)); } はnodejsで動作しません – einstein

+0

JSONでネイティブオブジェクトをエンコードすることはできません。なぜあなたはそれをしたいと思いますか? :S – Halcyon

1

あなたはモジュールのフルパスを決定するためにrequire.resolve(module)を使用することができます。

var path = require.resolve("a"); 

//or 

var path = require.resolve("./a.js"); 
+0

発信者が必ずしも事前に決定されているわけではないので、この方法は機能しません。 –

3

はまさに こちらの質問に答えていないが、いくつかは、このinformatに感謝かもしれませんイオン。フォーエバーNodeJS &(-monitor)で

、 以下はプロセスが開始されたファイル名が含まれています

process.mainModule.filename 

はいえ™多くの用途を試していません。

これはかなりまともな説明です:https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi

+0

助けて頂きました。ありがとう! – shriek

17

prepareStackTrace関数の復元に失敗すると、問題が発生する可能性があります。ここでは副作用を取り除く例です

function _getCallerFile() { 
    var originalFunc = Error.prepareStackTrace; 

    var callerfile; 
    try { 
     var err = new Error(); 
     var currentfile; 

     Error.prepareStackTrace = function (err, stack) { return stack; }; 

     currentfile = err.stack.shift().getFileName(); 

     while (err.stack.length) { 
      callerfile = err.stack.shift().getFileName(); 

      if(currentfile !== callerfile) break; 
     } 
    } catch (e) {} 

    Error.prepareStackTrace = originalFunc; 

    return callerfile; 
} 
+0

素晴らしい!私はそれに関連する問題を何時間も解決しようとしていました。元の機能を再割り当てするとすべてが修正されました。 –

関連する問題