Node js как получить переменную из другого файла

Обновлено: 05.07.2024

В одном из моих JS файлов я включаю еще один. Как установить переменные во включенном модуле?

Я думал, что что-то вроде этого будет работать

И затем в mymodule

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

Есть ли способ сделать это без globals, так что я могу самостоятельно устанавливать переменные в разных требуемых модулях?

NodeJS require() всегда будет загружать модуль один раз, поэтому вам нужно будет реализовать область видимости в вашем модуле, где могут существовать разные экземпляры модуля со своим собственным внутренним состоянием.

Вы можете реализовать свой модуль как класс JS, например:

Затем в вашем коде

Проблема с тем, что вы делали, заключается в том, что вы задали переменную после импорта, но this.myvariable === 'test'; вызывается, когда модуль был импортирован, прежде чем ваша переменная была установлена.

Вы можете настроить модуль на функцию, а затем вызвать функцию при импорте, передав переменную в качестве аргумента.

Если вы используете этот метод, имейте в виду, что вы получаете другой экземпляр своего модуля, куда бы вы ни импортировали, что может быть не таким, каким вы хотите.

Если вы хотите установить значения модуля извне модуля, хорошим вариантом является то, чтобы ваш модуль экспортировал объект с помощью метода setter и использовал его для установки значения переменной как свойства объекта. Это делает более понятным, что вы хотите, чтобы это значение было настраиваемым, тогда как просто выполнение myModule.myVar = может привести вас к путанице позже.

В этом случае вы получаете доступ к тому же экземпляру модели, где бы вы ее не импортировали.

Изменить в ответ на комментарий

В первом варианте вы показываете, где вы получаете другой экземпляр каждый время, как я могу экспортировать несколько функций, каждый из которых имеет один и тот же MYVAR? Если этот модуль экспортирует 5 функций, каждый из которых нуждается в myVar, могу ли я установите его в одном месте, как во время импорта, а не передайте его в каждая функция?

Не совсем уверен, понимаю ли я то, что вы описываете, но вы можете сделать что-то вроде этого:

Каждый из этих подмодулей будет иметь доступ к одному и тому же myVar. Таким образом, вы должны импортировать как указано выше, и результатом будет объект, содержащий каждый из ваших пяти модулей в качестве свойств. Я не могу сказать, хорошая ли это идея, она становится довольно запутанной, но, возможно, это имеет смысл для вашей ситуации.

Должно работать нормально. Вот рабочий пример:

Имейте в виду, если вы используете this в закрытии, что область действия больше не является самим модулем. Так что это может быть вашей проблемой.

Можете ли вы показать мне часть кода модуля, в которой вы используете это?

Сегодня мы поговорим о том, как работать с файловой системой средствами Node.js, рассмотрим базовые операции, выполняемые с файлами. К таким операциям относятся следующие:

  • Создание файла
  • Чтение файла
  • Запись данных в файл
  • Удаление файла
  • Переименование файла




Модуль fs

В Node.js имеется стандартный модуль, fs (сокращение от File System), дающий разработчику средства для работы с файловой системой. Импортировать его в проект можно так:


Методы этого модуля представлены в синхронной и асинхронной формах. Функции обратного вызова, передаваемые асинхронным методам, принимают в качестве первого параметра объект ошибки, а в качестве второго — данные, возвращённые при успешном выполнении операции. Рассмотрим пример:


Метод .readFile() , о котором мы ещё поговорим, предназначен для чтения файлов. В этом примере у функции обратного вызова есть два параметра — err и data . В первый параметр попадают ошибки, которые могут возникнуть при попытке чтения файла, во втором оказываются данные, полученные после успешного выполнения операции. Обратите внимание на то, что .readFile() — это асинхронный метод модуля fs . Его синхронная версия называется .readFileSync() . Похожий подход используется и для именования других методов модуля.

Создание нового файла

Начнём с примера:


Здесь метод fs.open() используется для создания нового файла. В качестве первого аргумента он принимает имя файла. Его второй аргумент представляет собой флаг, указывающий системе на то, что именно мы хотим сделать с файлом. В данном случае это флаг w (сокращение от writing), который указывает на то, что мы хотим открыть файл для записи. Метод .open() может принимать различные флаги. Вот некоторые из них:

  1. r : открыть файл для чтения
  2. r+ : открыть файл для чтения и записи
  3. rs : открыть файл для чтения в синхронном режиме
  4. w : открыть файл для записи
  5. a : открыть файл для записи данных в конец файла
  6. a+ : открыть файл для чтения и для записи данных в конец файла

Запись данных в файл

Поговорим о том, как дописать что-нибудь в файл:


Здесь мы используем метод .appendFile() для добавления данных в конец существующего файла. В качестве первого аргумента этот метод принимает имя файла, в качестве второго — данные, которые нужно добавить в конец файла. Третий аргумент — это, как обычно, функция обратного вызова.

После того, как код, показанный выше, успешно отработает, содержимое файла будет выглядеть так:


Существует и другой способ записи данных в файл. Он подразумевает использование метода .writeFile() . Этот метод очень похож на .appendFile() , но у него есть одно важное отличие. Дело в том, что с помощью метода .appendFile() мы добавляем в файл новые данные после тех данных, которые в нём уже есть. А при использовании метода .writeFile() содержимое файла заменяется на новое. Испытаем этот метод:


После успешного выполнения операции в файле окажется следующий текст:

Для работы с файлами в Node.js используется встроенный модуль fs , который выполняет все синхронные и асинхронные операции ввода/вывода применительно к файлам. Чтение и запись файла могут осуществляться одним из двумя способов:

  • с использованием Buffer ;
  • через создание соответствующего потока.

Чтение файлов и директорий¶

Для чтения файла в асинхронном режиме используется метод Node.js readFile() , который принимает три параметра:

  • путь к файлу;
  • кодировка;
  • callback-функция, вызываемая после получения содержимого файла.

Callback-функции передается два аргумента: ошибка и полученные данные в строковом формате. Если операция прошла успешна, то в качестве ошибки передается null .

Если в readFile() не указать кодировку, то данные файла будут возвращены в формате Buffer .

Поскольку метод выполняется асинхронно, то не происходит блокировки главного процесса Node.js. Но в некоторых случаях может понадобиться синхронное чтение файла, для этого есть метод readFileSync() , но при этом выполнение главного процесса будет заблокировано до тех пор, пока полностью не будет загружено содержимое файла.

Node.js readFileSync() возвращает результат чтения файла и принимает два параметра:

Обработка и перехват ошибок при использовании readFileSync() осуществляется с помощью конструкции try<. >catch() <. >.

Чтобы инициировать ошибку, укажите неправильный путь к файлу.

Методы readFile() и readFileSync() для работы с файлами используют Buffer . Но есть и другой способ считать содержимое файла: создать поток с помощью Node.js fs.createReadStream() . Любой поток в Node.js является экземпляром класса EventEmitter , который позволяет обрабатывать возникающие в потоке события.

Параметры, принимаемые fs.createReadStream() :

  • путь к файлу;
  • объект со следующими настройками:
  • encoding - кодировка (по умолчанию utf8 );
  • mode - режим доступа (по умолчанию 0o666 );
  • autoClose - если true , то при событиях error и finish поток закроется автоматически (по умолчанию true ).

Вместо объекта настроек можно передать строку, которая будет задавать кодировку.

Использование потока имеет ряд преимуществ перед Buffer :

Для чтения директорий используются методы readdir() и readdirSync() , для асинхронного и синхронного режимов соответственно.

Node.js readdir() работает асинхронно и принимает три аргумента:

  • путь к директории;
  • кодировку;
  • callback-функцию, которая принимает аргументами ошибку и массив файлов директории (при успешном выполнении операции ошибка передается как null ).

Node.js readdirSync() работает синхронно, возвращает массив найденных файлов и принимает два параметра:

Создание и запись файлов и директорий¶

В Node.js файлы могут быть записаны также синхронно и асинхронно. Для асинхронной записи имеется метод writeFile() , принимающий следующие аргументы:

  • путь к файлу;
  • данные для записи;
  • параметры записи:
  • кодировка (по умолчанию utf8 );
  • права доступа (по умолчанию 0o666 );
  • callback-функция, которая вызывается по завершению операции и единственным аргументом принимает ошибку (в случае успешной записи передается null ).

Если нет необходимости указывать параметры записи, то третьим параметром Node.js writeFile() можно сразу передать callback-функцию.

Для синхронной записи Node.js файла используйте writeFileSync() . Метод принимает все те же аргументы, что и writeFile() за исключением callback-функции. В качестве значения возвращает undefined .

Как и в случае с readFileSync() обработка ошибок происходит с помощью try<. >catch() <. >.

Методы writeFile() и writeFileSync() перезаписывают уже имеющуюся в файле информацию новыми данными. Если вам нужно внести новые данные без удаления старых, используйте методы appendFIle() и appendFileAsync() , которые имеют идентичные параметры.

Для записи файла через потока ввода имеется метод fs.createWriteStream() , который возвращает поток ввода и принимает два параметра:

  • путь к файлу;
  • объект со следующими настройками:
  • encoding - кодировка (по умолчанию utf8 );
  • mode - режим доступа (по умолчанию 0o666 );
  • autoClose - если true , то при событиях error и finish поток закроется автоматически (по умолчанию true ).

Чтобы создать директорию, используйте методы mkdir() и mkdirSync() .

Node.js mkdir() работает асинхронно и принимает в качестве параметров:

  • путь к директории;
  • объект со следующими настройками:
  • recursive - если true , создает директорию и все ее родительские директории согласно указанному пути, если они еще не существуют (по умолчанию false , т. е. все родительские директории уже должны быть созданы, иначе будет сгенерирована ошибка);
  • mode - режим доступа, параметр не поддерживается на ОС Windows (по умолчанию 0o777 );
  • callback-функцию, которая единственным аргументом принимает ошибку, при успешном создании директории передается null .

Вторым параметром можно сразу передать callback-функцию.

Node.js mkdirSync() создает директорию синхронно и возвращает undefined . Обработка ошибок осуществляется через try<. >catch() <. >. Метод mkdirSync() принимает те же параметры, что и mkdir() , за исключением callback-функции.

Удаление файлов и директорий¶

Чтобы удалить в Node.js файлы используйте методы unlink() и unlinkSync() .

Метод unlink() асинхронный и принимает имя файла, который нужно удалить, и callback-функцию с ошибкой в качестве параметра ( null , если удаление прошло успешно).

Для синхронного удаления файла используйте unlinkSync() , которому единственным аргументом передается имя файла.

Для удаления директорий имеются методы rmdir() и rmdirSync() соответственно. Они полностью идентичны unlink() и unlinkSync() , только вместо имени файла принимают имя директории.

можно ли использовать переменную в файле с именем first.js внутри другого файла под названием second.js ?

first.js содержит переменную colorcodes .

как сказал Фермин, переменная в глобальной области должна быть доступна для всех скриптов, загруженных после ее объявления. Вы также можете использовать свойство window или (в глобальной области) this чтобы получить тот же эффект.

Это должно работать-определить глобальную переменную в firstfile и получить к ней доступ из secondfile:

обратите внимание, что порядок загрузки файлов скриптов имеет значение для некоторых браузеров (IE6 наверняка, возможно, другие)

мне понравилось, что ответ выше сказал, но, хотя, это не сработало со мной

потому что я был declaring эти переменные inside в jQuery $( document ).ready()

поэтому убедитесь, что вы объявлять переменные внутри <script> - тег не где-то еще

Если вы храните свои цветовые коды в глобальной переменной, вы должны иметь доступ к нему из любого файла javascript.

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

затем импортируйте переменную во второй файл с помощью импорт.

я наткнулся на усилить.js. Он очень прост в использовании. Чтобы сохранить значение, назовем его "myValue", вы делаете:

и получить к нему доступ, Вы делаете

возможно, я делаю это немного по-другому. Я не уверен, почему я использую этот синтаксис, скопировал его из какой-то книги давным-давно. Но каждый из моих JS файлы определяет переменную. Первый файл без всякой причины называется R:

и затем, если у меня есть большой кусок кода, который я хочу разделить, я помещаю его в отдельный файл и другое имя переменной, но я все еще могу ссылаться на переменные и функции R. Я назвал новый TD без уважительной причины все:

вы можете видеть, что где в TD 'sepfunction' я называю R. somefunction. Я понимаю, что это не дает эффективности выполнения, потому что оба скрипта нужно загрузить, но это помогает мне держать мой код организованным.

Читайте также: