fs.readFileSync не зависит от файла? Node.js


104

-Предположим, у меня есть файл в корне моего проекта под названием "file.xml"

-Предположим, у меня есть тестовый файл в tests / под названием "test.js", и в нем есть

const file = fs.readFileSync("../file.xml");

Если я теперь запускаю node ./tests/test.jsиз корня своего проекта, он говорит, что ../file.xml не существует. Если я запустил ту же команду из каталога тестов, она заработает.

Кажется, что fs.readFileSync относится к каталогу, из которого вызывается скрипт, а не к тому месту, где он фактически находится. Если бы я написал fs.readFileSync("./file.xml")в test.js, это выглядело бы более запутанным и несовместимым с относительными путями в операторе require, которые относятся к файлу.

Почему это?

Как мне избежать необходимости переписывать пути в моем fs.readFileSync?


3
__dirnameне обязательно совпадает с текущим рабочим каталогом, но fs.readFileSync()использует текущий рабочий каталог. Текущий рабочий каталог, скорее всего, будет таким, каким он был при запуске node.
— jfriend00

Ответы:


181

Вы можете разрешить путь относительно местоположения исходного файла, а не текущего каталога, используя path.resolve:

const path = require("path");
const file = fs.readFileSync(path.resolve(__dirname, "../file.xml"));

1
Спасибо. Это работает, и я испытываю желание принять это, но есть идеи, зачем это нужно? Я хотел бы объяснить разработчикам в моей команде, зачем нужен дополнительный шаг, поскольку он не нужен в заявлении require. Пример: если бы у меня был модуль в корневом каталоге с именем module.js, мне нужно было бы только require ("../ module.js") в test.js
— Арман

10
Поскольку относительные пути разрешаются с использованием текущего каталога. И вы хотите решить, используя другой каталог. Из документации : «Можно использовать относительный путь к имени файла. Помните, однако, что этот путь будет относительным к process.cwd ()».
— cartant

по какой-то причине мне пришло в голову, что, поскольку локальный файл не работал в моей удаленной среде, я. нужно будет получить файл по полному URL. Однако, конечно, я этого не сделал и смог использовать этот метод для определения абсолютного пути на моем удаленном сервере ..
— weaveoftheride
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.