Node.js, impossible d'ouvrir les fichiers. Erreur: ENOENT, stat './path/to/file'

126

J'ai développé un programme node.js en utilisant le framework express sur mon ordinateur, où il fonctionne bien sans aucune plainte.

Cependant, lorsque j'exécute le programme sur mon appareil SUSE Studio, où il est destiné à vivre, je reçois une erreur lors de toute interaction de fichier.

Error: ENOENT, stat './path/to/file'

J'ai vérifié que les autorisations de fichier sont correctes, ce qu'elles sont. Mon ordinateur et mon appareil exécutent différentes versions de node, si cela est important.

Des pensées?


la source
1
Puisque le chemin est relatif, peut-être l'exécutez-vous à partir d'un répertoire différent? Comment générez-vous le chemin et quelle est la structure des répertoires? Et comment exécutez-vous node?
loganfsmyth
1
Merci, oui, j'exécutais le script à partir d'un répertoire différent et supposé bêtement que le chemin du fichier serait relatif au script lui-même. Je savais que c'était quelque chose de simple comme ça :)
Cela devrait être réparable. Pouvez-vous ajouter du code montrant comment vous créez le chemin et ce à quoi vous vous attendez à ce qu'il résout? Si vous voulez qu'il soit relatif à un fichier particulier, normalement vous le feriez__dirname + 'path/to/file';
loganfsmyth
Ouais, c'est ce que j'ai fait maintenant. J'exécutais le script en exécutant "node ~ / path / to / script.js" et je m'attendais à ce que les références relatives aux fichiers de mon script se résolvent en "~ / path / to" Merci!

Réponses:

187

Les chemins indiqués avec un .sont relatifs au répertoire de travail actuel et non au fichier de script. Ainsi, le fichier peut être trouvé si vous exécutez node app.jsmais pas si vous exécutez node folder/app.js. La seule exception à cela est require('./file')et cela n'est possible que parce qu'il requireexiste par module et qu'il sait donc de quel module il est appelé.

Pour créer un chemin relatif au script, vous devez utiliser la __dirnamevariable.

var path = require('path');

path.join(__dirname, 'path/to/file')

ou potentiellement

path.join(__dirname, 'path', 'to', 'file')
loganfsmyth
la source
11
Merci; ce sont parfois les petites choses comme ça qui sont difficiles à trouver dans la documentation, pour les débutants (comme moi!).
5

Voici le code pour utiliser votre app.js

l'entrée spécifie le nom du fichier

res.download(__dirname+'/'+input);
AmirtharajCVijay
la source