28

2 つのファイルがあるdir/a.jsとします。lib/b.js

a.js:

b = require('../lib/b');
b.someFn();

b.js:

var fallback = "./config.json";
module.exports = {
  someFn = function(jsonFile) {
    console.log(require(jsonFile || fallback);
  }
}

この例の の全体的な目的はb.jsjson ファイルを読み取ることなので、b.someFn("path/to/file.json").

しかし、構成ファイルのように、デフォルトが必要です。ただし、デフォルトはb.jsではなくa.jsを基準にする必要があります。言い換えると、 から呼び出すことができるはずでb.someFn()a.js「パスを渡されなかったので、デフォルトのパスを と仮定します」と言うはずですconfig.json。しかし、デフォルトは に対して相対的でなければなりません。a.jsつまり、すべきdir/config.jsonなく すべきです。lib/config.jsonrequire(jsonFile)

を取得できましたがcwd、それは 内からスクリプトを起動した場合にのみ機能しますdir/

の中で、「私を呼び出した関数の をください」b.jsと言う方法はありますか?someFn()__dirname

4

3 に答える 3

36

callsiteを使用してから:

b.js:

var path = require('path'),
    callsite = require('callsite');

module.exports = {
  someFn: function () {
    var stack = callsite(),
        requester = stack[1].getFileName();

    console.log(path.dirname(requester));
  }
};
于 2013-08-09T11:13:10.697 に答える