Manière de référencer les fichiers relatifs à la racine de l'application dans Node.JS
J'ai un Node.JS application fonctionnant sur Linux à AWS EC2 qui utilise le module fs à lire dans les fichiers modèles HTML. Voici la structure actuelle de l'application:
/server.js
/templates/my-template.html
/services/template-reading-service.js
Les templates HTML sera toujours à cet endroit, cependant, le modèle de lecture-service peut se déplacer à des endroits différents (plus profond des sous-répertoires, etc.) À partir de l'intérieur du modèle-la lecture-service que j'utilise fs.readFileSync() pour charger le fichier, comme ceci:
var templateContent = fs.readFileSync('./templates/my-template.html', 'utf8');
Cela lève l'erreur suivante:
Error: ENOENT, no such file or directory './templates/my-template.html'
Je suis en supposant que c'est parce que le chemin d'accès './' est la résolution de l' '/services/annuaire de et pas la racine de l'application. J'ai aussi essayé de changer le chemin d'accès '../templates/my-template.html "et cela a fonctionné, mais il semble fragile parce que j'imagine que c'est juste la résolution relative à "un répertoire'. Si je déplace le modèle de la lecture-service de l'approfondissement de sous-répertoire, le chemin de casser.
Alors, quelle est la bonne façon de fichiers de référence par rapport à la racine de l'application?
source d'informationauteur user1438940
Vous devez vous connecter pour publier un commentaire.
Essayer
Pour obtenir un absolu chemin du système de fichiers dans le répertoire où le nœud processus est en cours d'exécution, vous pouvez utiliser
process.cwd()
. Donc en supposant vous exécutez /server.js comme un processus qui met en œuvre /services/template-reading-service.js comme un module, vous pouvez effectuer les opérations suivantes à partir de /service/template-reading-service.js:Si cela ne fonctionne pas, alors vous pourriez être en cours d'exécution /service/template-reading-service.js comme un processus distinct, auquel cas vous aurez besoin d'avoir tout ce que lance le processus de passer le chemin d'accès que vous désirez traiter comme le primaire racine de l'application. Par exemple, si /server.js lance /service/template-reading-service.js comme un processus distinct, puis /server.js devrait passer son propre processus.mdc().
Accepté réponse est fausse. Coder en dur
path.join(__dirname, '../templates')
fera exactement ce n'est pas voulu, faire de laservice-XXX.js
fichier briser l'application principale si elle se déplace à une sous-localisation (comme dans l'exemple donnéservices/template
).À l'aide de
process.cwd()
sera de retour le chemin d'accès racine du fichier qui a initié le processus en cours d'exécution (ainsi, à titre d'exemple un/Myuser/myproject/server.js
retourne/Myuser/myproject/
).C'est un doublon de la question Déterminer la racine du projet en cours d'exécution node.js application.
Sur cette question, le
__dirname
répondre à eu la bonne fouetter qu'il mérite.Méfiez-vous de la marque verte, des passants.