Nodejsのパスの問題を解決する方法
この記事は主に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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Node.js と Tomcat の主な違いは次のとおりです。 ランタイム: Node.js は JavaScript ランタイムに基づいていますが、Tomcat は Java サーブレット コンテナです。 I/O モデル: Node.js は非同期ノンブロッキング モデルを使用しますが、Tomcat は同期ブロッキング モデルです。同時実行処理: Node.js はイベント ループを通じて同時実行を処理しますが、Tomcat はスレッド プールを使用します。アプリケーション シナリオ: Node.js はリアルタイム、データ集約型、同時実行性の高いアプリケーションに適しており、Tomcat は従来の Java Web アプリケーションに適しています。

Node.js はサーバー側の JavaScript ランタイムであり、Vue.js は対話型ユーザー インターフェイスを作成するためのクライアント側の JavaScript フレームワークです。 Node.js はバックエンド サービス API 開発やデータ処理などのサーバー側開発に使用され、Vue.js はシングルページ アプリケーションや応答性の高いユーザー インターフェイスなどのクライアント側開発に使用されます。

Node.js は、高いパフォーマンス、スケーラビリティ、クロスプラットフォーム サポート、豊富なエコシステム、開発の容易さなどの機能を備えているため、バックエンド フレームワークとして使用できます。

Node.js インストール ディレクトリには、npm と npm.cmd という 2 つの npm 関連ファイルがあります。違いは次のとおりです。拡張子が異なります。npm は実行可能ファイルで、npm.cmd はコマンド ウィンドウのショートカットです。 Windows ユーザー: npm.cmd はコマンド プロンプトから使用できますが、npm はコマンド ラインからのみ実行できます。互換性: npm.cmd は Windows システムに固有ですが、npm はクロスプラットフォームで使用できます。使用上の推奨事項: Windows ユーザーは npm.cmd を使用し、他のオペレーティング システムは npm を使用します。

Node.js には次のグローバル変数が存在します。 グローバル オブジェクト: グローバル コア モジュール: プロセス、コンソール、require ランタイム環境変数: __dirname、__filename、__line、__column 定数: unknown、null、NaN、Infinity、-Infinity

はい、Node.js はバックエンド開発言語です。これは、サーバー側のビジネス ロジックの処理、データベース接続の管理、API の提供などのバックエンド開発に使用されます。

Node.js と Java の主な違いは、設計と機能です。 イベント駆動型とスレッド駆動型: Node.js はイベント駆動型で、Java はスレッド駆動型です。シングルスレッドとマルチスレッド: Node.js はシングルスレッドのイベント ループを使用し、Java はマルチスレッド アーキテクチャを使用します。ランタイム環境: Node.js は V8 JavaScript エンジン上で実行され、Java は JVM 上で実行されます。構文: Node.js は JavaScript 構文を使用し、Java は Java 構文を使用します。目的: Node.js は I/O 集中型のタスクに適しており、Java は大規模なエンタープライズ アプリケーションに適しています。

Web 開発において Node.js と Java にはそれぞれ長所と短所があり、どちらを選択するかはプロジェクトの要件によって異なります。 Node.js はリアルタイム アプリケーション、迅速な開発、マイクロサービス アーキテクチャに優れており、Java はエンタープライズ グレードのサポート、パフォーマンス、セキュリティに優れています。
