Советы по 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/. Вы также можете оставить хлопок, или пятьдесят!