Node.js, не может открывать файлы. Ошибка: ENOENT, stat './path/to/file'


126

Я разработал программу node.js, используя экспресс-фреймворк на своем компьютере, где она отлично работает без нареканий.

Однако, когда я запускаю программу на своем устройстве SUSE Studio, где она предназначена для размещения, я получаю сообщение об ошибке при любом взаимодействии с файлом.

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

Я проверил, что права доступа к файлам верны, и это так. На моем компьютере и моем устройстве используются разные версии узла, если это важно.

Есть предположения?


1
Поскольку путь относительный, возможно, вы запускаете его из другого каталога? Как вы генерируете путь и какова структура каталогов? А как у вас работает нода?
loganfsmyth

1
Спасибо, да, я запускал сценарий из другого каталога и по глупости предполагал, что путь к файлу будет относиться к самому сценарию. Я знал, что это что-то простое :)

Это должно быть поправимо. Можете ли вы добавить код, показывающий, как вы прокладываете путь и что вы ожидаете от него? Если вы хотите, чтобы он __dirname + 'path/to/file';
относился

Да, вот что я сделал сейчас. Я запускал сценарий, выполнив "node ~ / path / to / script.js" и ожидая, что относительные ссылки на файлы в моем сценарии разрешатся в "~ / path / to" Спасибо!

Ответы:


187

Пути, указанные с помощью a, .относятся к текущему рабочему каталогу, а не к файлу сценария. Таким образом, файл может быть найден, если вы запустите, node app.jsно не при запуске node folder/app.js. Единственное исключение из этого - require('./file')и это возможно только потому, что requireсуществует для каждого модуля и, следовательно, знает, из какого модуля он вызывается.

Чтобы задать путь относительно скрипта, вы должны использовать __dirnameпеременную.

var path = require('path');

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

или потенциально

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

11
Спасибо; иногда такие мелочи трудно найти в документации для новичков (таких как я!).

5

Вот код для использования вашего app.js

ввод указывает имя файла

res.download(__dirname+'/'+input);
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.