この記事は主にnodejsのパス問題の解決策を紹介します。内容は非常に優れているので、参考として共有します。
同社の最近の開発プロジェクトでは、バックエンドとして Nodejs を使用しました。この 2 日間、顧客のデモンストレーション用にパッケージングする必要があったので、会社の人に前の 3D コンピュータ ルームからパッケージング ツールを移植してもらいました。パッケージ化後、もともと開発環境で正常に動作していたプロジェクトにアクセスできなくなっていることがわかりました。プロジェクトのホームページにアクセスできないという問題があります:
ファイルindex.htmlを取得できません
express.static
何が問題ですか?
nodejs バックエンドは Express を使用し、index.html は静的ファイルです。画像、CSS、JavaScript ファイルなどの静的ファイルは、Express の組み込みの Express.static を通じて簡単にホストできることがわかっています。
静的リソース ファイルが配置されているディレクトリをパラメータとして Express.static ミドルウェアに渡し、静的リソース ファイルへのアクセスを提供します。たとえば、画像、CSS、および JavaScript ファイルがパブリック ディレクトリに配置されていると仮定すると、次のコードを使用できます:
app.use(express.static('public'));
そこで、プロジェクト内のコードを見つけて、静的呼び出しが行われる場所を確認します。これは次のコードに非常に似ています。上記のコード行:
app.use(express.static('public'));
以上です。私は問題を発見しました。この問題は相対パスを使用しなくても解決できると友達に伝えました。パッケージングの時間制限があるため、最初に友達に簡単に対処してもらい、パッケージ化した後、自分の考えを整理します:
app.use(express.static('resource/public'));
もちろん、最も重要なことは、この問題はもっと勉強すれば難しくないということです。 、この問題は発生しないので、友達は自分でやってください。
そうですね、この場所は依然として相対ディレクトリです。今後の製品ではより良い状況に変更される予定です。
express.staticメソッドの分析
実際、express.staticメソッドが相対パスで渡された場合、expressはそれを独自に絶対パスに変換します。ソースコードを確認して、expressで見つけることができます。 .js 次のコード:
exports.static = require('serve-static');
説明: static は、serve-static パッケージを呼び出します。このパッケージを直接見つけて、index.js を確認してください。コードが表示されます。重要な 2 行は以下にリストされています
... var resolve = require('path').resolve ... opts.root = resolve(root) ...
これらの 2 行は、 Express は相対ディレクトリを置きます 絶対ディレクトリに変換されたコードから、最終的には組み込みオブジェクト パスの解決メソッドが使用されていることがわかります。
パスオブジェクトのresolveメソッド
次のように、このメソッドのAPIドキュメントを直接表示します: https://nodejs.org/api/path.html#path_path_resolve_paths
以下は説明です。このメソッドの:
path.resolve() メソッドは、一連のパスまたはパス セグメントを絶対パスに解決します。
これは何を意味しますか? このメソッドは、
path.resolve('/foo','bar'); // return /foo/bar
のような絶対パスに一連のパスまたはパス セグメントを編成します。詳細な手順についてはドキュメントを参照してください。ここには特別な注意が必要な文があります:
指定されたすべてのパス セグメントを処理した後の場合。絶対パスがまだ生成されていない場合、現在の作業ディレクトリが使用されます。
は、すべてのパス セグメントが処理され、絶対パスが生成されていない場合は、現在の作業ディレクトリを使用する必要があることを意味します。例:
path.resolve('bar'); // 加上 /Users/terry 是当前工作目录, return /Users/terry/bar
API ドキュメントのより複雑な例 (右から左に解決する際に注意してください。詳細についてはドキュメントを参照してください):
path.resolve('wwwroot', 'static_files/png/', '../gif/image.gif'); // if the current working directory is /home/myself/node, // this returns '/home/myself/node/wwwroot/static_files/gif/image.gif'
ここでの質問は、現在の作業ディレクトリが何かということです。
nodejs 現在の作業ディレクトリ 現在の作業ディレクトリ
nodejs 現在の作業ディレクトリは、Node が起動されるディレクトリです。つまり、ノードを開始するためにどのディレクトリに入っても、そのディレクトリに戻ります。
このディレクトリは、js ファイルが配置されているディレクトリを参照するものではないことに注意してください。
現在の作業ディレクトリは、process.cwd() メソッドを通じて取得できます。
以下は、/Users/terry/Documents/JSWorkspace ディレクトリに js ファイル test.js を記述する例です。コードは 1 行だけです。このとき、ディレクトリ /Users の /terry/Documents/JSWorkspace:node test.js でコマンドを実行すると、出力は次のようになります:
console.log(process.cwd());
ただし、ディレクトリ /Users/terry/Documents/ でコマンドを実行すると、 :node ./JSWorkspace/test.js、出力結果は次のようになります:
/Users/terry/Documents/JSWorkspace
どのディレクトリでnodeコマンドを実行したかがわかります。現在のディレクトリはそのディレクトリです。
前のパッケージングの問題に戻りますが、開発段階では通常、nodeコマンドはjsファイルが配置されているディレクトリで直接実行されるため、現在のディレクトリからの相対ディレクトリを記述しても問題ありません。 jsファイル。
しかし、パッケージ化後、nodeの実行はjsディレクトリの上位に配置されます。このとき、相対ディレクトリ「public」は js ファイルに対する相対ディレクトリではなく、前のレイヤに対する相対ディレクトリになります。したがって、このフォルダの下にあるindex.html ファイルも見つかりません。
解決方法
1.在前面已经说过了,改这个相对目录。但这种方法很蹩脚。因为,启动node命令的目录可能会变;而是如果这应该,开发阶段的node命令执行也需要跟着改。 总之不是兼容性很好的方法。
2.直接使用绝对路径。 但是这个绝对路径在不同的机器上又不一样,该如何解决呢?可以考虑使用全局变量__dirname.
全局变量__dirname
查看api文档 https://nodejs.org/api/modules.html#modules_dirname
看到解释如下:
The directory name of the current module. This is the same as the path.dirname() of the __filename。
啥意思呢,及时返回nodejs 的js文件的所在目录。
有了这个变量之后,我们就可以用如下代码解决这个问题。
app.use(express.static(__dirname + '/public'));
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
以上がNodejsのパスの問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。