0

私は最初のNode.jsモジュールの作成に取り組んでおり、これを処理するための最良の方法を決定するのに苦労しています。ユーザーによる入力としてモジュールへのファイルへのパスを受信するための推奨される方法は何ですか?次に、それがどこにあるかをどのように解決できますか?ユーザーが私のモジュールを呼び出した場所と私の実行中のコードの場所は、2つの異なる場所にあります。

これをさらに一歩進めましょう。ユーザーがこれらのパスの配列(config / settings.json内)を含むJSON構成ファイルを持っているとしましょう:

{
  "paths": [
    "../path1",
    "path2",
    "/path/to/path3",
    "~/path4"
  ]
}

現在、これらのパスは、実行中のコードではなく、構成ファイルに関連していることは明らかです。これは間違っていると感じます。私のメソッドは__dirname、、を参照する構成ファイルのパスなどを受け入れる必要があるためです__dirname

var mymodule = require('mine');
mymodule(__dirname, './config/settings.json');

構成から読み取ったファイルはすべて、この構成ファイルの場所に基づいている必要があります。これは奇妙に感じます。提案?

4

2 に答える 2

0

私は複雑さを避け、絶対パスのみを選びます。ほとんどのユーザーはとにかく__dirname+'../relativepath'を実行します。(少なくともそれは私がしていることです)。

于 2012-05-06T23:47:00.753 に答える
0

FileUtilsソースから:

var updateFileProperties = function (file, path){
    file._path = null;
    file._usablePath = null;
    file._isAbsolute = false;

    if (path === undefined || path === null) return;

    path = PATH.normalize (path);

    var index = path.indexOf (":") + 1;
    var windowsRoot = path.substring (0, index);
    path = path.substring (index);

    //https://github.com/joyent/node/issues/3066
    if (path[0] === "/" && path[1] === "/"){
        path = path.replace (/[\/]/g, "\\");
        path = path.substring (0, path.length - 1);
    }

    file._isAbsolute = path[0] === SLASH;
    file._path = windowsRoot + path;
    file._usablePath = file._isAbsolute ? file._path : (windowsRoot + PATH.join (file._relative, path));
};

var File = function (path){
    var main = process.mainModule.filename;
    var cwd = main.substring (0, main.lastIndexOf (SLASH));
    var relative = PATH.relative (process.cwd (), cwd);

    this._relative = relative;
    //...omitted

    updateFileProperties (this, path);
};

このコードは、相対パスの問題を解決します。 _usablePath実際のパスが含まれています。「。」pathは、メインファイルが配置されているディレクトリになります。どのように呼び出されても、期待されるディレクトリを指します。

何がnew File (<path>).getPath ()返されるかを出力する関数をテストできます。

于 2012-05-07T10:57:35.180 に答える