Советы по Node.js за 5 минут или меньше, часть. 5
Я обнаружил, что при написании сценариев или приложений Node.js в некоторых случаях необходимо найти абсолютный путь к текущему запущенному сценарию.
Скрипты Node.js или даже приложения — это, по сути, просто файл JavaScript, который находится где-то на жестком диске. Даже если сценарий имеет несколько файлов, любой оператор запускается только из одного файла JavaScript.
Это создает проблему, абсолютный путь всегда меняется в зависимости от пути к файлу, сценарий которого выполняется в данный момент.
Давайте представим сценарий, в котором есть два файла. index.js
с кодом:
import { testScript } from './lib/scripts' testScript(); // the current path is ./
А внутри lib/scripts.js
:
export const testScript = () => { // the current path is ./lib/scripts.js }
Несмотря на то, что сценарии происходят из одного и того же файла index.js
, текущий путь отличается.
Когда я обнаружил необходимость получить текущий путь?
Ну, есть несколько случаев.
Файл загружен
При загрузке файлов в серверную часть, написанную на Node.js, вам нужно найти путь, по которому вы хотите сохранить ваши файлы.
var oldpath = files.filetoupload.path; var newpath = 'C:/Users/Your Name/' + files.filetoupload.name; fs.rename(oldpath, newpath, function (err) { if (err) throw err; res.write('File uploaded and moved!'); res.end(); });
Строку var newpath = 'C:/Users/Your Name/' + files.filetoupload.name;
можно улучшить, как мы увидим в следующем разделе.
Запись файла
При записи данных или информации в файл вам также может понадобиться указать абсолютный путь, который будет дополняться именем файла для записи данных.
fs = require('fs')
fs.writeFile('/etc/doesntexist', 'abc', function (err,data) {
if (err) {
return console.log(err);
}
console.log(data);
});
Вместо записи /etc/doesntexist'
вы можете найти текущий путь, а затем добавить имя файла.
Как найти текущий путь?
В Node.js я обнаружил, что есть три метода, с помощью которых я могу найти текущий путь.
__имя_каталога
Это переменная, которая возвращает путь к каталогу текущего исполняемого JS-файла.
console.log(__dirname); // /var/www/node/node-project/
процесс.cwd()
Как и переменная __dirname
, process.cwd()
возвращает текущий рабочий каталог или каталог, в котором находится файл для текущего выполняемого кода.
let path = process.cwd() console.log(path) // /var/www/node/node-project
./
Это вернет текущий каталог только при использовании с require()
для импорта из других файлов. В противном случае он вернет каталог, из которого был запущен скрипт узла.
Разница между ./
и __dirname
./
всегда будет возвращать каталог, в котором был инициирован скрипт, __dirname всегда будет возвращать текущий рабочий каталог. Пример рассмотрим файлы, расположенные в /var/www/node
. index.js
и /lib/write.js
. В write.js
.
import { testWrite } from './lib/write' testWrite()
А внутри файл /lib/write.js
export const testWrite() => { fs.writeFile(__dirname + "hey.txt","hey",()=>{}); fs.writeFile("./hey.txt","hey"); }
Как только мы запустим node index.js
, произойдет следующее:
- Один файл будет записан в каталог
node
. Это будет строка, в которой используется./
. - Другой файл будет записан в директорию
node/lib
. Это будет создано строкой с переменной__dirname
.
В двух словах, __dirname
даст абсолютный путь к файлу, в котором в данный момент выполняется код, а ./
даст путь к каталогу, в котором текущий скрипт был запущен командой node /path/to/script
.
Спасибо за чтение. Смотрите другие замечательные статьи https://javascript.whenprogramming.com/. Вы также можете оставить хлопок, или пятьдесят!