Как получить путь к текущему скрипту в Node.js?
Как получить путь к скрипту в Node.js?
Я знаю, что есть process.cwd()
, но он возвращает лишь директорию, из которой был вызван скрипт, а не директорию самого скрипта. Например, если я находюсь в /home/kyle/
и выполняю следующую команду:
node /home/kyle/some/dir/file.js
Если я вызову process.cwd()
, я получу /home/kyle/
, а не /home/kyle/some/dir/
. Есть ли способ получить именно эту директорию?
5 ответ(ов)
В общем, вы можете сделать так:
fs.readFile(path.resolve(__dirname, 'settings.json'), 'UTF-8', callback);
Используйте resolve()
, вместо того чтобы конкатенировать с '/'
или '\'
, иначе вы столкнетесь с проблемами совместимости между платформами.
Примечание: __dirname
— это локальный путь к модулю или включенному скрипту. Если вы пишете плагин, которому нужно знать путь к основному скрипту, вы можете воспользоваться:
require.main.filename
или, чтобы просто получить имя папки:
require('path').dirname(require.main.filename)
В ответ на ваш вопрос: Используйте __dirname!!
__dirname
Это имя директории текущего модуля. Он равен path.dirname()
для __filename
.
Пример: если вы выполните команду node example.js
из директории /Users/mjr
, то:
console.log(__dirname);
// Выводит: /Users/mjr
console.log(path.dirname(__filename));
// Выводит: /Users/mjr
Для получения пути к директории в ESModules вам следует использовать:
import.meta.url
import { fileURLToPath } from 'url';
import path from 'path';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
console.log(__dirname);
// Выводит: директория текущего модуля
console.log(path.dirname(__filename));
// Выводит: директория текущего модуля, то же самое, что и __dirname
Дополнительную информацию вы можете найти в документации Node.js.
Этот код возвращает текущую директорию:
var currentPath = process.cwd();
Например, чтобы использовать этот путь для чтения файла, вы можете сделать следующее:
var fs = require('fs');
fs.readFile(process.cwd() + "\\text.txt", function(err, data) {
if(err)
console.log(err);
else
console.log(data.toString());
});
Здесь мы используем process.cwd()
для получения пути к текущей директории, а затем соединяем его с именем файла text.txt
, чтобы прочитать содержимое этого файла с помощью модуля fs
. Если возникает ошибка, она выводится в консоль, иначе выводится содержимое файла в строковом формате.
В данном фрагменте кода происходит чтение и парсинг JSON-файла settings.json
, который расположен в директории скрипта. Вот по шагам, что делает этот код:
require('fs')
- подключает встроенный модульfs
, который предоставляет функциональность работы с файловой системой.require('path')
- подключает модульpath
, помогающий работать с путями к файлам.path.resolve(__dirname, 'settings.json')
- формирует абсолютный путь к файлуsettings.json
, используя текущую директорию (__dirname
).fs.readFileSync(..., 'utf8')
- синхронно читает содержимое файла по указанному пути и возвращает текстовое содержимое в кодировке UTF-8.JSON.parse(...)
- парсит строку JSON в JavaScript-объект.
В результате переменная settings
будет содержать объект JavaScript, представляющий данные из файла settings.json
.
Пример того, как это можно было бы написать на русском:
var настройки =
JSON.parse(
require('fs').readFileSync(
require('path').resolve(
__dirname,
'настройки.json'),
'utf8'));
Не забудьте, что использование readFileSync
блокирует выполнение кода до завершения чтения файла. Если файл большой или операции выполняются часто, рассмотрите возможность применения асинхронного подхода с fs.readFile
.
В каждой программе на Node.js существуют глобальные переменные в ее среде, которые представляют собой информацию о вашем процессе. Одной из таких переменных является __dirname
. Эта переменная содержит путь к директории, в которой находится текущий исполняемый файл, и может быть полезна для работы с файловой системой, позволяя вам легко получать доступ к ресурсам, расположенным относительно текущего файла.
Как предотвратить установку "devDependencies" модулей NPM для Node.js (package.json)?
Ошибка "npm WARN package.json: Нет поля repository"
Как исправить ошибку "ReferenceError: primordials is not defined" в Node.js
Как протестировать один файл с помощью Jest?
nvm постоянно "забывает" Node.js в новой сессии терминала