Maison  >  Article  >  interface Web  >  Comment résoudre le problème de chemin de nodejs

Comment résoudre le problème de chemin de nodejs

不言
不言original
2018-06-30 15:13:461950parcourir

Cet article présente principalement la solution au problème du chemin nodejs. Le contenu est assez bon, je vais le partager avec vous maintenant et le donner comme référence.

Un projet de développement récent de l'entreprise utilisait nodejs comme backend. Au cours des deux derniers jours, j'avais besoin de l'emballer pour une démonstration client, j'ai donc demandé à un gars de l'entreprise de transplanter l'outil d'emballage de l'ancienne salle informatique 3D. Après l'empaquetage, j'ai constaté que le projet qui fonctionnait initialement bien dans l'environnement de développement n'était plus accessible. Il y a un problème qui empêche l'accès à la page d'accueil du projet :

impossible d'obtenir le fichier index.html

express .static

Quel est le problème ?

Le backend nodejs utilise express et index.html est un fichier statique. Nous savons que les fichiers statiques, tels que les images, les fichiers CSS, JavaScript, etc., peuvent être facilement hébergés via express.static intégré à Express.

Passer le répertoire où se trouvent les fichiers de ressources statiques en tant que paramètre au middleware express.static peut donner accès aux fichiers de ressources statiques. Par exemple, en supposant que les images, les fichiers CSS et JavaScript sont placés dans le répertoire public, vous pouvez utiliser le code suivant :

 app.use(express.static('public'));

Alors, trouvez le code dans le projet et vérifiez où l'appel statique est effectué , qui est très similaire à la ligne de code ci-dessus :

 app.use(express.static('public'));

À ce stade, j'ai découvert le problème, j'ai dit à mes amis que ce problème pouvait être résolu sans utiliser de chemins relatifs. En raison du temps limite pour faire mes bagages, j'ai demandé à mes amis de s'en occuper brièvement d'abord. Après avoir fait mes bagages, je ferai le tri dans mes pensées :

app.use(express.static('resource/public'));

Bien sûr, le plus important est que ce problème soit. pas difficile, vous pouvez donc étudier davantage par vous-même, il est facile de trouver le problème, et ce problème ne se produira pas, alors mes amis, faites-le vous-même.

Eh bien, vous avez bien lu, cet endroit est toujours un annuaire relatif. Cela sera modifié pour une meilleure situation dans les produits ultérieurs.

Analyse de la méthode Express.static

En fait, si la méthode express.static passe dans un chemin relatif, express la convertira tout seul Pour un chemin absolu, nous pouvons vérifier le code source et trouver le code suivant dans express.js :

exports.static = require('serve-static');

Description static appelle le package serve-static, trouvez directement ce package, vérifiez index.js, vous peut voir En ce qui concerne le code, les deux lignes importantes

 ...
var resolve = require('path').resolve
...
opts.root = resolve(root)
...

sont répertoriées ci-dessous. Ces deux lignes sont le code pour express pour convertir le répertoire relatif en répertoire absolu. du chemin d'objet intégré est finalement utilisé.

Méthode de résolution de l'objet chemin

Consultez directement la documentation de l'API de cette méthode, comme suit : https://nodejs.org/api /path .html#path_path_resolve_paths

Voici une explication de cette méthode :

La méthode path.resolve() résout une séquence de chemins ou de segments de chemin dans un chemin absolu.

Qu'est-ce que cela signifie ? Cette méthode organise une série de chemins ou de segments de chemin en un chemin absolu, tel que

 path.resolve('/foo','bar');
// return /foo/bar

Veuillez vous référer à la documentation pour des instructions détaillées. Il y a ici une phrase qui nécessite une attention particulière :

Si après avoir traité tous les segments de chemin donnés, un chemin absolu n'a pas encore été généré, le répertoire de travail actuel est utilisé.


Qu'est-ce que cela signifie, c'est-à-dire : si tous les segments de chemin et un chemin absolu ne sont pas générés, le répertoire de travail actuel doit être utilisé. Par exemple :

 path.resolve('bar');
// 加上 /Users/terry 是当前工作目录, return /Users/terry/bar
Un exemple plus complexe dans le document api (notez ici lors de la résolution, de droite à gauche, reportez-vous au document pour plus de détails) :

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'
Le courant problème Oui, quel est le répertoire de travail actuel.


répertoire de travail actuel de nodejs répertoire de travail actuel

nodejs Le répertoire de travail actuel est le répertoire dans lequel Node est démarré. En d’autres termes, quel que soit le répertoire à partir duquel vous entrez pour démarrer le nœud, il reviendra à ce répertoire.

Notez que ce répertoire ne fait pas référence au répertoire où se trouve le fichier js.


Le répertoire de travail actuel peut être obtenu via la méthode process.cwd().


Ce qui suit est un exemple pour présenter le répertoire de travail actuel. Si vous écrivez un fichier js, test.js, dans le répertoire /Users/terry/Documents/JSWorkspace, il n'y a qu'une seule ligne de. code :

console.log(process.cwd());
Si à ce moment, exécutez la commande : node test.js dans le répertoire /Users/terry/Documents/JSWorkspace, le résultat est le suivant :

 /Users/terry/Documents/JSWorkspace
Mais s'il se trouve dans le répertoire /Users/terry/Documents/ Exécutez la commande ci-dessous : node ./JSWorkspace/test.js Le résultat de sortie est :

/Users/terry/Documents
Par conséquent, vous pouvez voir dans lequel. répertoire dans lequel vous exécutez la commande node et le répertoire actuel est ce répertoire.


Pour en revenir au problème de packaging précédent, puisque dans la phase de développement, la commande node est généralement exécutée directement dans le répertoire où se trouve le fichier js, il n'y a donc aucun problème pour écrire le répertoire relatif par rapport au répertoire du fichier js actuel.


Mais après packaging, l'exécution du nœud est placée dans la couche supérieure du répertoire js. À l'heure actuelle, le répertoire relatif "public" n'est plus relatif au fichier js, mais relatif à la couche précédente. Naturellement, ce dossier est introuvable, et donc le fichier index.html sous le dossier est introuvable.


Comment résoudre

Solution :

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中文网!

相关推荐:

Node.js中路径处理模块path的介绍

如何在NodeJS项目中使用ES6

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn