Импорт и работа модуля Node js FS чтение и удаление файлов и директорий, выполнение других функций


Содержание материала:

Экспорт и импорт

Директивы экспорт и импорт имеют несколько вариантов вызова.

В предыдущей главе мы видели простое использование, давайте теперь посмотрим больше примеров.

Экспорт до объявления

Мы можем пометить любое объявление как экспортируемое, разместив export перед ним, будь то переменная, функция или класс.

Например, все следующие экспорты допустимы:

Обратите внимание, что export перед классом или функцией не делает их Не найдена статья «function-expressions-arrows» . Это всё также объявление функции, хотя и экспортируемое.

Большинство руководств по стилю кода в JavaScript не рекомендуют ставить точку с запятой после объявлений функций или классов.

Поэтому в конце export class и export function не нужна точка с запятой:

Экспорт отдельно от объявления

Также можно написать export отдельно.

Здесь мы сначала объявляем, а затем экспортируем:

…Или, технически, мы также можем расположить export выше функций.

Импорт *

Обычно мы располагаем список того, что хотим импортировать, в фигурных скобках import <. >, например вот так:

Но если импортировать нужно много чего, мы можем импортировать всё сразу в виде объекта, используя import * as . Например:

На первый взгляд «импортировать всё» выглядит очень удобно, не надо писать лишнего, зачем нам вообще может понадобиться явно перечислять список того, что нужно импортировать?

Для этого есть несколько причин.

Современные инструменты сборки (webpack и другие) собирают модули вместе и оптимизируют их, ускоряя загрузку и удаляя неиспользуемый код.

Предположим, мы добавили в наш проект стороннюю библиотеку say.js с множеством функций:

Теперь, если из этой библиотеки в проекте мы используем только одну функцию:

…Тогда оптимизатор увидит, что другие функции не используются, и удалит остальные из собранного кода, тем самым делая код меньше. Это называется «tree-shaking».

Явно перечисляя то, что хотим импортировать, мы получаем более короткие имена функций: sayHi() вместо say.sayHi() .

Явное перечисление импортов делает код более понятным, позволяет увидеть, что именно и где используется. Это упрощает поддержку и рефакторинг кода.

Импорт «как»

Мы также можем использовать as , чтобы импортировать под другими именами.

Например, для краткости импортируем sayHi в локальную переменную hi , а sayBye импортируем как bye :

Экспортировать «как»

Аналогичный синтаксис существует и для export .

Давайте экспортируем функции, как hi и bye :

Теперь hi и bye – официальные имена для внешнего кода, их нужно использовать при импорте:

Экспорт по умолчанию

На практике модули встречаются в основном одного из двух типов:

  1. Модуль, содержащий библиотеку или набор функций, как say.js выше.
  2. Модуль, который объявляет что-то одно, например модуль user.js экспортирует только class User .

По большей части, удобнее второй подход, когда каждая «вещь» находится в своём собственном модуле.

Естественно, требуется много файлов, если для всего делать отдельный модуль, но это не проблема. Так даже удобнее: навигация по проекту становится проще, особенно, если у файлов хорошие имена, и они структурированы по папкам.

Модули предоставляют специальный синтаксис export default («эспорт по умолчанию») для второго подхода.

Ставим export default перед тем, что нужно экспортировать:

Заметим, в файле может быть не более одного export default .

…И потом импортируем без фигурных скобок:

Импорты без фигурных скобок выглядят красивее. Обычная ошибка начинающих: забывать про фигурные скобки. Запомним: фигурные скобки необходимы в случае именованных экспортов, для export default они не нужны.

Именованный экспорт Экспорт по умолчанию
export class User

export default class User
import from . import User from .

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

Так как в файле может быть максимум один export default , то экспортируемая сущность не обязана иметь имя.

Например, всё это – полностью корректные экспорты по умолчанию:

Это нормально, потому что может быть только один export default на файл, так что import без фигурных скобок всегда знает, что импортировать.

Без default такой экспорт выдал бы ошибку:

Имя «default»

В некоторых ситуациях для обозначения экспорта по умолчанию в качестве имени используется default .

Например, чтобы экспортировать функцию отдельно от её объявления:

Или, ещё ситуация, давайте представим следующее: модуль user.js экспортирует одну сущность «по умолчанию» и несколько именованных (редкий, но возможный случай):

Вот как импортировать экспорт по умолчанию вместе с именованным экспортом:

И, наконец, если мы импортируем всё как объект import * , тогда его свойство default – как раз и будет экспортом по умолчанию:

Довод против экспортов по умолчанию

Именованные экспорты «включают в себя» своё имя. Эта информация является частью модуля, говорит нам, что именно экспортируется.

Именованные экспорты вынуждают нас использовать правильное имя при импорте:

…В то время как для экспорта по умолчанию мы выбираем любое имя при импорте:

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

Обычно, чтобы избежать этого и соблюсти единообразие кода, есть правило: имена импортируемых переменных должны соответствовать именам файлов. Вот так:

Тем не менее, в некоторых командах это считают серьёзным доводом против экспортов по умолчанию и предпочитают использовать именованные экспорты везде. Даже если экспортируется только одна вещь, она всё равно экспортируется с именем, без использования default .

Это также немного упрощает реэкспорт (смотрите ниже).

Реэкспорт

Синтаксис «реэкспорта» export . from . позволяет импортировать что-то и тут же экспортировать, возможно под другим именем, вот так:

Зачем это нужно? Рассмотрим практический пример использования.

Представим, что мы пишем «пакет»: папку со множеством модулей, из которой часть функционала экспортируется наружу (инструменты вроде NPM позволяют нам публиковать и распространять такие пакеты), а многие модули – просто вспомогательные, для внутреннего использования в других модулях пакета.

Структура файлов может быть такой:

Мы бы хотели сделать функционал нашего пакета доступным через единую точку входа: «главный файл» auth/index.js . Чтобы можно было использовать его следующим образом:

Идея в том, что внешние разработчики, которые будут использовать наш пакет, не должны разбираться с его внутренней структурой, рыться в файлах внутри нашего пакета. Всё, что нужно, мы экспортируем в auth/index.js , а остальное скрываем от любопытных взглядов.

Так как нужный функционал может быть разбросан по модулям нашего пакета, мы можем импортировать их в auth/index.js и тут же экспортировать наружу.

Теперь пользователи нашего пакета могут писать import from «auth/index.js» .

Запись export . from . – это просто более короткий вариант такого импорта-экспорта:

Реэкспорт экспорта по умолчанию

При реэкспорте экспорт по умолчанию нужно обрабатывать особым образом.

Например, у нас есть user.js , из которого мы хотим реэкспортировать класс User :

export User from ‘./user.js’ не будет работать. Казалось бы, что такого? Но возникнет синтаксическая ошибка!

Чтобы реэкспортировать экспорт по умолчанию, мы должны написать export , как в примере выше. Такая вот особенность синтаксиса.

export * from ‘./user.js’ реэкспортирует только именованные экспорты, исключая экспорт по умолчанию.

Если мы хотим реэкспортировать и именованные экспорты и экспорт по умолчанию, то понадобятся две инструкции:

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

Итого

Вот все варианты export , которые мы разобрали в этой и предыдущей главах.

Вы можете проверить себя, читая их и вспоминая, что они означают:

  • Перед объявлением класса/функции/…:
    • export [default] class/function/variable .
  • Отдельный экспорт:
    • export .
  • Реэкспорт:
    • export from «module»
    • export * from «module» (не реэкспортирует export default ).
    • export from «module» (реэкспортирует только export default ).
  • Именованные экспорты из модуля:
    • import from «module»
  • Экспорт по умолчанию:
    • import x from «module»
    • import from «module»
  • Всё сразу:
    • import * as obj from «module»
  • Только подключить модуль (его код запустится), но не присваивать его переменной:
    • import «module»

Мы можем поставить import/export в начало или в конец скрипта, это не имеет значения.

То есть, технически, такая запись вполне корректна:

На практике импорты, чаще всего, располагаются в начале файла. Но это только для большего удобства.

Обратите внимание, что инструкции import/export не работают внутри <. >.

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

…Но что, если нам в самом деле нужно импортировать что-либо в зависимости от условий? Или в определённое время? Например, загрузить модуль, только когда он станет нужен?

Мы рассмотрим динамические импорты в следующей главе.

nodejs основы

NODE.JS – программное средство для выполнения js.

Nodejs = V8 + I/O + библиотеки

V8: быстро, современно, экономно

Преимущества

  • Javascript
  • Общий код на клиенте и на сервере
  • Основные задачи по web
  • Много соединений и задач одновременно
  • Легко создать рабочий прототип
  • Удобный менеджер пакетов npm
  • Сообщество

Установка

при установке nodejs прописывает себя в переменную PATH (+ npm), [администрирование – переменные среды]; можно проверить в командной строке:
set PATH

Как правило под nodejs запускают файлы: напишем простой скрипт и запустим его посредством командной строки:

Скрипт будет выполнен и результат отобразится в командной строке.

Документация по nodejs

Модули nodejs

Чтобы разобраться как работают встроенные модули nodejs необходимо скачать архив с исходниками с сайта nodejs (source code). И зайти в директорию lib . (команда dir — получаем список файлов через командную строку; Если вам необходимо перечислить файлы во всех вложенных папках, то вместо » dir » используйте » dir /s «). Если вы поставили nodejs из пакета, то в папке lib файлов не обнаружите.

В nodejs есть модули с разной степенью стабильности. (например, 0 – не стоит использовать; 1 , 2 – использовать можно но API модуля может измениться).

Функции растут (проект развивается) и со временем нам потребуется вынести функцию-конструктор USER в отдельный файл. Вот тут-то в дело вступают модули.

Модули этого своего рода способ, который предлагает nodejs для организации проекта.

Проекты как правило разрастаются, что приводит к желанию разбить проект на несколько файлов – вот тут-то в дело вступают модули.

require

Для html-страниц для подключения скриптов используют тег script . В nodejs существует специальная команда require .

В нашем примере мы обращаемся к файлу ( user.js ) в той же директории (расширение ( .js ) писать необязательно).

Первое отличие модульной системы nodejs от браузерных скриптов: если в браузере есть два тега script , то функция, которая определена на глобальном уровне одном из них доступна и в другом, а в nodejs нет. В nodejs функции и переменные являются глобальными для данного файла (они не становятся доступными при подключении посредством require ). Таким образом nodejs позволяет писать действительно независимые модули. Но чтобы модуль был доступен используется система экспортов. В каждом модуле есть специальная переменная exports .

Модуль-директория DIR/index

Подключаем непосредственно папку var user = require(«./user»); , в которой лежит соответствующий index.js .

Подключаем и используем конструктор User в файле ./server.js

« ./ » — относительно текущей папки

exports – это объект и то, что туда положено, вернется как результат require (exports.jpg). Таким образом модуль может объявить свои приватные переменные/функции и экспортировать лишь то, что необходимо.

Для глобальных переменных и т.д. существует объект global

Итог

  • Подключение require
  • Переменные: var (приватные у модулей), exports , global (используется редко)
  • Виды модулей: js , node ( с расширением .node), json (с расширением .json ) . Модули json используются в том случае, когда требуется хранить какую-либо простую информацию на файле.
  • Модуль-директория DIR/index

Объект module

  • Объект module
  • Модуль или приложение? module.parent
  • Модуль-функция module.exports = function
  • Кеширование модулей (заново модуль никогда не читается)
  • Расположение модулей: порядок поиска
  • Передаем параметры: модуль-фабрика

Объект module (основополагающий объект для модулей) является переменной, которая существует в каждом модуле (файле, можно вывести console.log(module); ). . Содержимое: свойство id – как правило путь к файлу,
parent – ссылка на родительский модуль ( module.parent — ссылка на родительский модуль, который require данный),
children ( module.children — те модули, которые подключены посредством require ),
свойство exports и другие.

Модуль или приложение? module.parent

Модуль может быть запущен напрямую, а если нет, если функционал подключен к другому модулю, то пусть он этот функционал экспортирует. Разделить эти два случая можно при помощи проверки:

пс: как говорится на stackoverflow.com Родетелем является модуль, который вызвал скрипт для интерпретации

Правильное использование module.exports

В контексте модуля:

module.exports = exports = this (данные конструкции равнозначны)

exports и this ссылки на module.exports .

Так как exports и this это всего лишь ссылки на объект, то если у них поменять значение, то они никак не повлияют на module.exports . Поэтому ранее мы использовали такой код: exports.User = User ;

Если вы хотите передать функцию не в объекте, а напрямую, то используйте следующий синтаксис:

Кеширование модулей

Когда Nodejs загружает модуль он полностью создает соответствующий объект module (с учетом parent , exports и других аналогичных свойств) и запоминает его у себя ( module.id (полный путь к файлу) служит идентификатором для внутреннего кэша) и в следующий раз, когда мы повторно обращаемся (подключаем) к какому-либо модулю (файлу), nodejs берет все тот же объект из кэша. То есть, например, инициализировать модуль достаточно 1 раз в каком-либо файле, в дальнейшем его можно просто использовать.

В нашем случае для var db = require(«../db»);
и для var db = require(«./db»); берется один и тот же объект. Поэтому принцип следующий: в первый раз, когда используется модуль, он инициализируется и в дальнейшем мы его только подключаем и пользуемся им (то есть в нашем случае нам не нужно использовать db.connect() дважды, то есть в разных файлах).

Расположение модулей: порядок поиска модулей в nodejs

Как сделать так, чтобы db подключалась всегда без указания специфичного пути:

в независимости от того в каком файле подключается db .

Для этого нужно понимать порядок поиска модулей в nodejs (то что происходит, когда вызывается require). В nodejs существует множество встроенных модулей, например, require(«fs»); , который будет подключен без проблем. Если же в require указать конкретный путь, например, require(«../db»); , то поиск будет вестись исходя из заданного пути и файл будет найден, либо nodejs попытается получить этот файл как директорию (и будет искать index.js внутри категории).

Если же указать require(«db»); и при этом модуль не является встроенным, то будет произведен поиск директории node_modules относительно текущего положения (если найдет, то попытается взять модуль из нее). Если директория node_modules отсутствует, то директория node_modules будет искаться выше и т.д.

Помимо указания конкретного пути для модуля, nodejs может искать модули следующим образом:

Введение в npm – менеджер пакетов для Node.JS

Модуль npm идет вместе со стандартной установкой node. В этом модуле содержится консольная утилита ( npm ), которая дает доступ к громадной базе данных модулей. (https://www.npmjs.com/ ) Как правило, если стоит стандартная задача по программированию, то модуль для нее найти не составит труда. Для того чтобы поделиться модулем с другими людьми необходимо:

  1. создать файл с описанием пакета ( package.json ), который содержит информацию о модуле (имя, версия и т.д.). Либо вручную, либо через команду
    npm init
    (запросит нужную информацию)
  2. Чтобы опубликовать модуль необходимо:
    1. Добавить юзера посредством команды npm adduser (необходимо ввесть Username и Password ). Теперь вся работа с npm будет от имени этого пользователя. Юзер может залогинится на https://www.npmjs.com/

    name_user и наблюдать за своими модулями.

  3. Публикация: npm publish
  • Далее кто-либо может использовать Ваш, добавленный в базу, модуль, а сам пользователь вносить изменения.
  • Получаем все команды npm при помощи команды npm help
  • Поиск нужно модуля в базе данных: npm s ключевые_слова или npm search ключевые_слова (например, npm s super module )
  • Устанавливаем модуль: npm install name_module или npm i name_module
  • При установке модулей nodejs сначала ищет папку node_modules в текущей директории (потом выше и выше и т.д), либо (если node_modules отсутствует) ищет package.json (также поднимаясь вверх; package.json , как правило, обозначает корень проекта) и, соответственно, если находит package.json, то делает в соответствующей директории папку node_modules ; если же оба варианта не проходят, то nodejs делает папку node_modules в текущей директории. Если вы хотите поставить модуль в определенную директорию, то в этой директории необходимо создать папку node_modules .
  • npm up обновить модуль (проверит модули на обновление, которые есть в папке node_modules )
  • npm remove имя_модуля (удалить модуль)
  • Вывод по npm:

    npm init
    nmp adduser
    npm publish
    npm search ключевые слова
    npm install модуль
    npm update модуль
    npm remove модуль
    npm help команда

    Структура пакета NPM

    Установка нужной версии, например: npm i express@3.0.0

    Последнюю версию модуля можно получить в том случае, если модуль разрабатывается, используя систему версинирования git, например, на github. Достаточно получить Git Read-Only (url): https://github.com/strongloop/express.git и в консоли:

    npm i https://github.com/strongloop/express.git

    dependencies в package.json

    dependencies указывает на те модули, от которых зависит данный.

    devDependencies

    Модули прописанные в devDependencies не ставятся, если модуль подтягивается как зависимость. Они ставятся лишь для разработки и их можно установить, если, например, зайти в модуль в папке node_modules и прописать npm i (или при установке флага npm config).

    поле main задает точку входа в пакет

    Глобальные модули

    Любой модуль можно поставить глобально, если поставить флаг -g : npm -g модуль

    File System

    АПИ является удовлетворительным. Совместимость с NPM имеет высший приоритет и не будет нарушена кроме случаев явной необходимости.

    Файл ввода / вывода обеспечивается простыми упаковщиками (программное средство создания системной оболочки для стандартизации внешних обращений и изменения функциональной ориентации действующей системы) вокруг стандартных функций POSIX (Portable Operating System Interface for Computer Environment [for Unix]) интерфейс переносимой операционной системы).

    Для использования этого модуля выполните require(‘fs’) . Все методы имеют асинхронные и синхронные формы.

    Асинхронная форма всегда принимает завершающий обратный вызов в качестве последнего аргумента. Аргументы, передаваемые на завершающий обратный вызов зависят от метода, но первый аргумент всегда зарезервирован для исключения. Если операция была завершена успешно, то первый аргумент будет null или undefined .

    При использовании синхронной формы любые исключения сразу выдаются. Вы можете использовать try/catch для обработки исключений или позволить им увеличиваться в количестве.

    Вот пример асинхронной версии:

    Вот синхронная версия:

    При использовании асинхронных методов не существует гарантированного упорядочивания. Таким образом, следующее склонно к ошибке:

    fs.stat может выполняется перед fs.rename . Правильный способ сделать это – выстроить по цепочке обратные вызовы.

    В нагруженных процессах программисту настоятельно рекомендуется использовать асинхронные версии этих вызовов. Синхронные версии будут блокировать весь процесс, пока они не будут выполнены — прекращая все соединения.

    Может быть использован связанный путь к имени файла. Однако, помните, что этот путь будет связан с process.cwd( ). Большинство fs функций позволяют вам пропускать аргумент обратного вызова. Если вы это сделали, то используется обратный вызов по умолчанию, который выдает ошибки снова. Чтобы получить след на оригинальный сайт вызова, установите окружение NODE_DEBUG изменяющимся.

    Буферный API

    fs функции поддерживают передачу и прием путей, как со строками, так и с буферами. Последние предназначены, чтобы сделать возможной работу с файловыми системами, которые разрешают имена файлов «не UTF-8».

    Для большинства типичных использований, работа с путями в качестве буферов будет излишней, так как строка API преобразует в, а так же из UTF-8 автоматически.

    Обратите внимание, что на некоторых файловых системах (например, NTFS и HFS +) имена файлов будут всегда кодированы как UTF-8. На таких файловых системах, которые передают не-UTF-8 закодированные Буферы функциям fs не будут работать должным образом.

    Класс : fs.FSWatcher

    Объекты, возвращаемые fs.watch() относятся к этому типу.

    Обратный вызов listener предоставляемый fs.watch() получает возвращаемые FSWatcher change события.

    Объект самостоятельно создает эти события:

    Событие: ‘change’

    • eventType Тип изменения fs
      • filename | Имя файла, которое изменилось (если релевантно / доступно )

    Генерируется когда что-то меняется в отслеживаемом каталоге или файле. Смотрите больше деталей в fs.watch() .

    Аргумент filename может быть не предусмотрен в зависимости от поддержки операционной системы.

    Если filename предоставляется, то в качестве Buffe r, если fs.watch () вызывается с его опцией encoding установленной на buffer, в противном случае filename будет с именем строки.

    Событие: ‘error’

    Генерируется когда создается событие.

    watcher.close()

    Прекратить наблюдение за изменениями на данном fs.FSWatcher.

    Класс: fs.ReadStream

    ReadStream это ЧИТАЕМЫЙ ПОТОК.

    Событие: ‘close’

    Генерируется когда базовый дескриптор файла ReadStream был закрыт с помощью метода fs.close() .

    Событие: ‘open’

    • fd Дескриптор файла Integer , используемый ReadStream.

    Он генерируется когда открывается файл в ReadStream.

    readStream.bytesRead

    Число байтов прочтенных до настоящего времени.

    readStream.path

    Путь к файлу поток читает исходя из того, как указано в первом аргументе fs.createReadStream() . Если path передается в виде строки, то readStream.path будет строкой.

    Если путь к файлу передается в качестве буфера, то readStream.path будет буфером.

    Класс: fs.Stats

    Объекты возвращаемые от fstat() , vs.lstat() и fs.fstat() и их синхронные аналоги относятся к этому типу.

    • stats.isFile()
    • stats.isDirectory()
    • stats.isBlockDevice()
    • stats.isCharacterDevice()
    • stats.isSymbolicLink() (действует только с fs.lstat() )
    • stats.isFIFO()
    • stats.isSocket()

    Для обычного файла util.inspect(stats) будет возвращать строку очень похожую на эту:

    Обратите внимание, что atime , mtime , birthtime и ctime являются экземплярами объекта Date и чтобы сравнить значения этих объектов вы должны использовать соответствующие методы.

    Для более общих случаев GetTime() возвращает количество миллисекунд, прошедшее с 1 января 1970 года 00:00:00 UTC, и этого числа должно быть достаточно для любого сравнения, однако существуют дополнительные методы, которые могут быть использованы для отображения нечеткой информации. Более подробную информацию можно найти на странице MDN JavaScript Reference .

    Stat Time Values

    Времена в объекте stat имеют следующие значения:

      Atime «Время доступа» — время, когда данные файла последний раз использовались. Меняется в системных вызовах MKNOD(2) , utimes(2) , и read(2) .

    mtime » время изменения » — время, когда данные файла последний раз менялись. Меняется с помощью системных вызовов mknod(2) , utimes(2) , и write(2) .

    ctime «Время изменения» — время, когда статус файла последний раз менялся (модификация данных индексного дескриптора).. Меняется с помощью системных вызовов chmod(2) , chown(2) , link(2) , mknod(2) , rename(2) , unlink(2) , utimes(2) , read(2) , и write(2) .

  • birthtime «Время рождения» — время создания файла. Установить один раз при создании файла. На файловых системах, где birthtime не доступен, это поле может вместо этого содержать либо ctime или 1970-01-01T00: 00Z (т.е. метка времени 0 эпохи Unix). Обратите внимание, что это значение может быть больше, чем atime или mtime в этом случае. На Darwi n и других вариантах FreeBSD , также устанавливается если atime явно устанавливается на более раннее значение, чем значение текущего birthtime с использованием системного вызова utimes(2) .
  • До Node v0.12, ctime поддерживал birthtime на системах Windows. Следует отметить, что по состоянию на v0.12, ctime не является «временем создания», также как и на системах Unix.

    Класс: fs.WriteStream

    WriteStream это перезаписываемый поток

    Событие: ‘close’

    Генерируется когда основной дескриптор файла WriteStream был закрыт с помощью метода fs.close() .

    Событие: ‘open’

    • fd — Дескриптор файла, используемый WriteStream . Генерируется когда открывается файл в WriteStream

    writeStream.bytesWritten

    Число байтов, записанных на данный момент. Не включает в себя данные, которые до сих пор в очереди для записи.

    writeStream.path

    Поток пишет путь к файлу как указано в первом аргументе в fs.createWriteStream() . Если путь к файлу передается в виде строки, то writeStream.path будет строкой. Если путь к файлу передается в качестве буфера, то writeStream.path будет буфером.

    fs.access(path[, mode], callback)

    • path — |
    • mode —
    • callback —

    Проверяет разрешения пользователя для файла или каталога указанного путем.

    Аргумент mode является необязательным целым числом, которое задает выполнение проверки доступности. Следующие константы определяют возможные значения mode (режима). Можно создать маску, состоящую из побитового (поразрядного), или состоящие из двух или более значений.

      fs.constants.F_OK — Путь виден вызывающему процессу. Это полезно для определения того, чтобы узнать существует ли файл, но ничего не говорит о правах доступа к RWX. Установлен по умолчанию, если не указан режим.

    fs.constants.R_OK — Путь может быть прочитан вызывающим процессом.

    fs.constants.W_OK — Путь может быть записан вызывающим процессом.

  • fs.constants.X_OK — Путь может быть выполнен вызывающим процессом. Это не работает на Windows (будет вести следующим образом: like.constants.F_OK ).
  • Последний аргумент, обратный вызов, является функцией обратного вызова, которая вызывается с возможным аргументом ошибки. Если какая-нибудь из проверок доступности терпит неудачу, то аргумент ошибки будет заполняться. В следующем примере проверяется может ли быть считан и записан текущим процессом файл / пароль / и т.д.

    Не рекомендуется использовать fs.access() , что бы проверить доступность файла перед вызовом fs.open() , fs.readFile() или fs.writeFile() . Таким образом, можно наблюдать гонку процессов, так как другие процессы могут изменить состояние файла между двумя вызовами. Вместо этого пользовательский код должен открывать/читать/записывать файл напрямую и обрабатывать ошибки доступа к файлу.

    Например:

    Запись файла НЕ РЕКОМЕНДУЕТСЯ

    Запись файла РЕКОМЕНДУЕТСЯ

    Чтение файла НЕ РЕКОМЕНДУЕТСЯ

    Чтение файла РЕКОМЕНДУЕТСЯ

    fs.accessSync(path[, mode])

    • path — |
    • mode —

    Синхронная версия fs.access() . Это выдается если происходят сбои в проверках доступности, если нет, то не выдается ничего.

    fs.appendFile(file, data[, options], callback)

    • file — | | имя файла или файловый дескриптор.
    • data — |
    • options — |
      • encoding — | по умолчанию = ‘utf8’
      • mode — по умолчанию = 0o666
      • flag — по умолчанию = ‘a’
    • callback —

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

    Если options является строкой, то он указывает кодировку

    Любой заданный дескриптор файла должен быть открыт для добавления.

    Примечание: Если дескриптор файла указан как file , то он не будет автоматически закрыт.

    fs.appendFileSync(file, data[, options])

    • file — | | имя файла или файловый дескриптор.
    • data — |
    • options — |
      • encoding — | по умолчанию = ‘utf8’
      • mode — по умолчанию = 0o666
      • flag — по умолчанию = ‘a’

    Синхронная версия fs.appendFile() . Возвращает следущее: undefined.

    fs.chmod(path, mode, callback)

    • path — | ;
    • mode —
    • callback —

    Асинхронный chmod(2) .
    Никакие другие аргументы кроме возможного исключения не задаются завершающему обратному вызову.

    fs.chmodSync(path, mode)


    • path — |
    • mode —

    Синхронный chmod(2) . Возвращает следующее undefined.

    fs.chown(path, uid, gid, callback)

    • path — |
    • uid —
    • gid —
    • callback —

    Асинхронный chown(2) . Никакие другие аргументы кроме возможного исключения не задаются завершающему обратному вызову.

    fs.chownSync(path, uid, gid)

    • path — |
    • uid —
    • gid —

    Синхронный chown(2) . Возвращает следующее undefined.

    fs.close(fd, callback)

    • fd —
    • callback —

    Асинхронный close(2) . Никакие другие аргументы кроме возможного исключения не задаются завершающему обратному вызову.

    fs.closeSync(fd)

    • fd —
    • Синхронный close(2) . Возвращает следующее undefined.

    fs.constants

    Возвращает объект, содержащий часто используемые константы для операций с файловой системой.

    Конкретные константы, определенные в настоящее время описаны в FS Constants .

    fs.createReadStream(path[, options])

    • path — |
    • options — |
      • flags —
      • encoding —
      • fd —
      • mode —
      • autoClose —
      • Start —
      • End —

    Возвращает новый объект ReadStream. (Читайте Readable Stream ).

    Имейте в виду, что, в отличие от значения по умолчанию, установленного для highWaterMark на считываемый поток (16 Кб), поток, возвращаемый этим методом имеет значение по умолчанию 64 кб для такого же параметра.

    options является объектом или строкой со следующими параметрами по умолчанию:

    options могут включать в себя start (начальные) и end (конечные ) значения для чтения определенного диапазона байтов из файла, а не весь файл. И start и end суммарны и начинаются с 0

    Кодирование может быть одним из таких, которые принимает Buffer. Если fd указан , то ReadStream будет игнорировать аргумент path и будет использовать указанный дескриптор файла.

    Это означает, что событие open не будет создано. Обратите внимание, что fd должен быть блокирующим; неблокирующие fd должны быть переданы net.Socket . Если autoclose ложный, то дескриптор файла не будет закрыт, даже если произошла ошибка. Это ваша закрыть его и убедитесь, что нет утечки дескриптора файла. Если Autoclose установлено значение true (поведение по умолчанию), при error или end дескриптор файла будет автоматически закрыт.

    mode устанавливает режим файла (разрешение и второй промежуточный бит округления), но только если файл был создан. Пример для чтения последних 10 байт файла, который имеет длину 100 байт:

    Если OPTIONS является строкой, то она определяет кодировку.

    fs.createWriteStream(path[, options])

    • path — |
    • options — |
      • flags —
      • defaultEncoding —
      • fd —
      • mode —
      • autoClose —
      • Start —

    Возвращает новый объект WriteStream . (Читайте Writable Stream ). options является объектом или строкой со следующими параметрами по умолчанию:

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

    Модификация файла, а не его замена может потребовать режим flags r+ а не в режим по умолчанию w . DefaultEncoding может быть любой из тех, что примет Buffer.

    Если autoClose установлено значение TRUE (поведение по умолчанию) в случае ошибки или завершения дескриптор файла будет автоматически закрыт.

    Если autoClose установлено значение TRUE (поведение по умолчанию) в случае error или end дескриптор файла будет автоматически закрыт.

    Если autoClose ложно, то дескриптор файла не будет закрыт, даже если есть ошибка. Это ваша обязанность закрыть его и убедиться, что нет утечки дескриптора файла.

    Как и в случае с ReadStream , если указан fd , то WriteStream будет игнорировать аргумент path и будет использовать указанный дескриптор файла. Это означает,что событие open не будет создано. Обратите внимание, что fd должен быть блокирующим; неблокирующие fd должны быть переданы net.Socket . Если options является строкой, то она указывает кодировку.

    fs.exists(path, callback)

    Стабильность: 0 – Не рекомендуется: Используйте вместо этого fs.stat() или fs.access()

    Проверьте, существует ли данный путь, проверяя с файловой системой. Затем вызовите аргумент callback со значением true или false .

    fs.exists() не должен использоваться, чтобы проверить, существует ли файл перед вызовом fs.open() . Это вводит состояние гонок, так как другие процессы могут изменить состояние файла между двумя вызовами.

    Вместо этого код пользователя должен вызвать fs.open() напрямую и обрабатывать вызванную ошибку, если файл не существует.

    fs.existsync(path)

    Стабильность: 0 – Не рекомендуется: Используйте вместо этого fs.statSync() or fs.accessSync()

    Синхронная версия fs.exists(). Показывает true если файл существует, false если не существует.

    fs.fchmod(fd, mode, callback)

    • fd —
    • mode —
    • callback —

    Асинхронный fchmod(2) .
    Никакие другие аргументы кроме возможного исключения не заданы завершающему обратному вызову.

    fs.fchmodSync(fd, mode)

    Синхронный fchmod(2) . Показывает undefined.

    fs.fchown(fd, uid, gid, callback)

    • fd —
    • uid —
    • gid —
    • callback —

    Асинхронный fchown(2) . Никакие другие аргументы кроме возможного исключения не заданы завершающему обратному вызову.

    fs.fchownSync(fd, uid, gid)

    • fd —
    • uid —
    • gid —

    Синхронный fchown(2) . Показывает undefined.

    fs.fdatasync(fd, callback)

    • fd —
    • callback —

    Асинхронный fdatasync(2) . Никакие другие аргументы кроме возможного исключения не заданы завершающему обратному вызову.

    fs.fdatasyncSync(fd)

    Синхронный fdatasync(2) . Показывает undefined.

    fs.fstat(fd, callback)

    • fd —
    • callback —

    Обратный вызов получает два аргумента ( err , stats ), где stats является объектом fs.Stats .

    fstat() идентична stat() , за исключением того, что файл который будет обработан stat() задается дескриптором файла fd .

    fs.fstatSync(fd)

    Синхронный fstat(2) . Возвращает запрос fs.Stats .

    fs.fsync(fd, callback)

    • fd —
    • callback —

    Асинхронный fsync(2) .
    Никакие другие аргументы кроме возможного исключения не заданы завершающему обратному вызову.

    fs.fsyncSync(fd)

    Синхронный fsync(2) . Показывает undefined.

    fs.ftruncate(fd, len, callback)

    • fd —
    • len —
    • callback —

    Асинхронный ftruncate(2) . Никакие другие аргументы кроме возможного исключения не заданы завершающему обратному вызову.

    Если файл на который ссылается файловый дескриптор был больше, чем количество байтов LEN , то в таком случае только первые Len байты будут сохранены в файле.

    Например, следующая программа сохраняет только первые четыре байта файла.

    Если файл оказался короче LEN , то оставшаяся часть будет заполнена нулевыми байтами (‘\ 0’)

    fs.ftruncateSync(fd, len)

    Синхронный ftruncate(2) . Показывает undefined.

    fs.futimes(fd, atime, mtime, callback)

    • fd —
    • atime —
    • mtime —
    • callback —

    Меняет временные метки файла, на который ссылается файловый дескриптор.

    fs.futimesSync(fd, atime, mtime)

    • fd —
    • atime —
    • mtime —

    Синхронная версия fs.futimes() . Показывает undefined.

    fs.lchmod(path, mode, callback)

    • path — |
    • mode —
    • callback —

    Никакие другие аргументы кроме возможного исключения не заданы завершающему обратному вызову. Доступно только на Mac OS X

    fs.lchmodSync(path, mode)

    • path — |
    • mode —

    Синхронный lchmod(2). Показывает undefined.

    fs.lchown(path, uid, gid, callback)

    • path — |
    • uid —
    • gid —
    • callback —

    Асинхронный lchown(2) .
    Никакие другие аргументы кроме возможного исключения не заданы завершающему обратному вызову.

    fs.lchownSync(path, uid, gid)

    • path — |
    • uid —
    • gid —

    Синхронный lchown(2) . Показывает undefined.

    fs.link(srcpath, dstpath, callback)

    • srcpath — |
    • dstpath — |
    • callback —

    Асинхронный link(2) . Никакие другие аргументы кроме возможного исключения не заданы завершающему обратному вызову.

    fs.linkSync(srcpath, dstpath)

    • srcpath — |
    • dstpath — |

    Синхронный link(2) . Показывает undefined.

    fs.lstat(path, callback)

    • path — |
    • callback —

    Обратный вызов получает два аргумента ( err , stats ) где stats является объектом fs.Stats.lstat() идентичен stat() , за исключением того, что, если path является символической ссылкой, то именно ссылка обрабатывается stat , а не тот файл на который она ссылается.

    fs.lstatSync(path)

    Синхронный lstat(2) . Возвращает запрос fs.Stats .

    fs.mkdir(path[, mode], callback)

    • path — |
    • mode —
    • callback —

    Асинхронный mkdir(2) . Никакие другие аргументы кроме возможного исключения не заданы завершающему обратному вызову. mode устанавливается по умолчанию на значение 0o777 .

    fs.mkdirSync(path[, mode])

    • path — |
    • mode —

    Синхронный mkdir(2) . Показывает undefined.

    fs.mkdtemp(prefix[, options], callback)

    • prefix —
    • options |
      • encoding — (по умолчанию ‘utf8’ )
    • callback —

    Создает уникальный временный каталог. Формирует шесть случайных символов, добавляемых за необходимый prefix , чтобы создать уникальный временный каталог.

    Созданный путь к папке передается в виде строки второму параметру обратного вызова .

    Пример:

    Примечание: Метод fs.mkdtemp() добавит шесть произвольно выбранных символов непосредственно в строку prefix .

    Например, директории задается /tmp , если нужно создать временный каталог в /tmp , префикс должен отделяться наклонной специальным разделителем пути ( require(‘path’).sep ).

    fs.mkdtempSync(prefix)

    • prefix —
    • options |
      • encoding — (по умолчанию ‘utf8’ )

    Синхронная версия fs.mkdtemp() . Показывает путь созданной папки.

    fs.open(path, flags[, mode], callback)

    • path — | (Строка/ Буфер)
    • flags — | (Строка/ Буфер)
    • mode —
    • callback —

    Открыт асинхронный файл. Смотрите open(2) .
    flags могут быть:

    ‘г’ — Открыть файл для чтения. Исключение возникает, если файл не существует.

    ‘г +’ — Открыть файл для чтения и записи. Исключение возникает, если файл не существует.

    ‘RS +’ — Открыть файл для чтения и записи в синхронном режиме. Инструктирует операционную систему, чтобы обойти кэш локальный файловой системы.

    Это в первую очередь полезно для открытия файлов на сборках NFS (Network File System/ сетевая файловая система), поскольку это позволяет пропустить потенциально старый локальный кэш. Она имеет очень реальное влияние на производительность ввода / вывода, поэтому не используйте этот флаг, до тех пор пока вам это не нужно.

    Обратите внимание, что это не превратит fs.open() в синхронно блокирующий вызов. Если это то, что вы хотите, то вы должны использовать fs.openSync()

    ‘w’ — Открыть файл для записи. Файл создается (если он не существует) или сокращается (если он существует).

    «WX» — как «w» , но не срабатывает, если существует путь.

    ‘w +’ — Открыть файл для чтения и записи. Файл создается (если он не существует) или сокращается (если он существует).

    «WX + ‘ — как ‘W + ‘ , но не срабатывает, если существует путь.

    ‘а’ — Открыть файл для добавления. Файл создается, если он не существует.

    ‘ax’ — как ‘A’ , но терпит неудачу, если существует путь.

    ‘а +’ — Открыть файл для чтения и добавления. Файл создается, если он не существует.

    ‘ах +’ — как «A +» , но не срабатывавет, если существует путь.

    mode устанавливает режим файла (разрешение и второй промежуточный бит округления), но только если файл был создан. По умолчанию это 0666 , для чтения и записи.

    Обработчик получает два аргумента ( ERR , FD ).

    Эксклюзивный флаг ‘х’ ( O_EXCL флаг в open(2)) гарантирует, что path вновь создан. На системах POSIX , path считается существующим, даже если он является символьной ссылкой на несуществующий файл. Исключающий флаг может или не может работать с Network File System/ сетевыми файловыми системами.

    flags также могут быть числом документируемым с помощью open(2) ; обычно используемые константы доступны из fs.constants . В операционной системе Windows, флаги переводятся в их эквиваленты, где это применимо, например O_WRONGLY в FILE_GENERIC_WRITE или O_EXCL | O_CREAT в CREATE_NEW , который был принят CreateFileW .

    В Linux , позиционные записи не работают, если файл открыт в режиме добавления. Ядро игнорирует позиционный аргумент и всегда добавляет данные в конец файла.

    Примечание: Поведение fs.open( ) зависит от платформы для некоторых флагов. Например, открытие каталога на OS X и Linux с помощью флага «A +» — смотри пример ниже — возвратит ошибку. В отличие от этого, на Windows , и FreeBSD , файловый дескриптор будет возвращен.

    fs.openSync(path, flags[, mode])

    • path — |
    • flags — | (Строка/ Буфер)
    • mode —

    Синхронная версия fs.open() . Возвращает целое число, представляющее дескриптор файла.

    fs.read(fd, buffer, offset, length, position, callback)

    • fd —
    • buffer — |
    • offset —
    • length —
    • position —
    • callback —

    Считывание данных из файла, указанного fd .

    buffer является буфером, куда будут записаны данные.

    offset смещение в буфере, чтобы начать запись на нем.

    length представляет собой целое число, определяющее количество байтов для чтения.

    position целое число, определяющее, где начать чтение из файла Если позиция имеет нулевое значение, данные будут прочитаны с текущей позиции файла.

    Обратный вызов получает три аргумента, ( ERR , BytesRead , buffer ).

    fs.readdir(path[, options], callback)

    • path — |
    • options — |
      • encoding — (по умолчанию ‘utf8’ )
    • callback —

    Асинхронный readdir(3) . Считывает содержимое каталога. Обратный вызов получает два аргумента ( err , files ), где files представляет собой массив имен файлов в директории исключая ‘.’ а также ‘..’ .

    Дополнительный аргумент options может быть строкой, определяющей кодировку, или объектом со свойством encoding определяющим схему кодирования символов, чтобы использовать ее для имен файлов, переданных в функцию обратного вызова. Если encoding устанавливается как ‘buffer’ , имена файлов которые возвращаются будут переданы в качестве объектов Buffer .

    fs.readdirSync(path[, options])

    • path — |
    • options — |
      • encoding — (по умолчанию ‘utf8’ )

    Синхронный readdir(3) . Возвращает массив имен файлов исключая ‘.’ а также ‘..’ .

    Дополнительный аргумент options может быть строкой, определяющей кодировку, или объектом со свойством encoding определяющим схему кодирования символов, чтобы использовать ее для имен файлов, переданных в функцию обратного вызова. Если encoding устанавливается как ‘buffer’ , имена файлов которые возвращаются будут переданы в качестве объектов Buffer .

    fs.readFile(file[, options], callback)

    • file — | | имя файла или файловый дескриптор
    • options — |
      • encoding — (по умолчанию ‘utf8’ )
      • flag — (по умолчанию ‘r’ )
    • callback —

    Асинхронно читает все содержимое файла. Пример:

    Обратному вызову передается два аргумента ( ERR , data ), где data это содержимое файла.

    Если не указано кодирования, тогда возвращается исходный буфер. Если options является строкой, то она определяет кодировку. Пример:

    Любой указанный дескриптор файла должен поддерживать чтение. Примечание: Если дескриптор файла указан как file , он не будет автоматически закрыт.

    fs.readFileSync(file[, options])

    • file — | | имя файла или файловый дескриптор
    • options — |
      • encoding — (по умолчанию ‘utf8’ )
      • flag — (по умолчанию ‘r’ )

    Синхронная версия fs.readFile . Возвращает содержимое файла. Если опция encoding задана, то эта функция возвращает строку. В противном случае она возвращает буфер.

    fs.readlink(path[, options], callback)

    • path — |
    • options — |
      • encoding — (по умолчанию ‘utf8’ )
    • callback —

    Асинхронный readlink(2) . Обратный вызов получает два аргумента ( err , linkString ).

    Дополнительный аргумент options может быть строкой, определяющей кодировку, или объектом со свойством encoding определяющим схему кодирования символов, чтобы использовать ее для имен файлов, переданных в функцию обратного вызова.

    Если encoding устанавливается как ‘buffer’ , имена файлов которые возвращаются будут переданы в качестве объектов Buffer .

    fs.readlinkSync(path[, options])

    • path — |
    • options — |
      • encoding — (по умолчанию ‘utf8’ )

    Синхронный readlink(2) . Возвращает значение строки символической ссылки.

    Дополнительный аргумент options может быть строкой, определяющей кодировку, или объектом со свойством encoding определяющим схему кодирования символов, чтобы использовать ее для имен файлов, переданных в функцию обратного вызова.

    Если encoding устанавливается как ‘buffer’ , имена файлов которые возвращаются будут переданы в качестве объектов Buffer .

    fs.readSync(fd, buffer, offset, length, position)

    • fd —
    • buffer — |
    • offset —
    • length —
    • position —

    Синхронная версия fs.read() . Возвращает количество bytesRead .

    fs.realpath(path[, options], callback)


    • path — |
    • options — |
      • encoding — (по умолчанию ‘utf8’ )
    • callback —

    Асинхронный realpath(3) . Обратный вызов получает два аргумента ( err , resolvedPath ). Может использовать process.cwd для разрешения относительных путей. Дополнительный аргумент options может быть строкой, определяющей кодировку, или объектом со свойством encoding определяющим символьную кодировку, используемую для того чтобы путь был передан обратному вызову.

    Если encoding устанавливается как buffer , то путь, который возвращается будет передан в качестве объекта Buffer .

    fs.realpathSync(path[, options])

    • path — |
    • options — |
      • encoding — (по умолчанию ‘utf8’ )

    Синхронный realpath(3) . Возвращает полученный путь. Дополнительный аргумент options может быть строкой, определяющей кодировку, или объектом со свойством encoding определяющим символьную кодировку, используемую для того чтобы путь был передан обратному вызову. Если encoding устанавливается как buffer , то путь, который возвращается будет передан в качестве объекта Buffer .

    fs.rename(oldPath, newPath, callback)

    • oldPath — |
    • newPath — |
    • callback —

    Никакие другие аргументы кроме возможного исключения не задаются завершающему обратному вызову.

    fs.renameSync(oldPath, newPath)

    • oldPath — |
    • newPath — |

    Синхронный rename(2) . Возвращает undefined.

    fs.rmdir(path, callback)

    • path — |
    • callback —

    Асинхронный rmdir(2) .
    Никакие другие аргументы кроме возможного исключения не задаются завершающему обратному вызову.

    fs.rmdirSync(path)

    Синхронный rmdir(2) . Показывает undefined.

    fs.stat(path, callback)

    • path — |
    • callback —

    Асинхронный stat(2) .
    Обратный вызов получает два аргумента ( err , stats ), где stats это объект fs.Stats . Смотрите раздел fs.Stats для дальнейшей информации.

    fs.statSync(path)

    Синхронный stat(2) . Показывает запрос fs.Stats .

    fs.symlink(target, path[, type], callback)

    • target — |
    • path — |
    • type —
    • callback —

    Асинхронный symlink(2 ). Никакие другие аргументы кроме возможного исключения не заданы завершающему обратному вызову. Аргумент type может быть установлен ‘dir’ , ‘file ‘ или ‘junction ‘ (по умолчанию ‘file’ ) и доступен только в ОС Windows (игнорируется на других платформах).

    Обратите внимание, что точки соединения Windows требуют полный путь назначения. При использовании ‘junction’ , аргумент target будет автоматически стандартизован к полному пути. ПРИМЕР:

    Он создает символическую ссылку с именем «new-port» , которая указывает на «foo» .

    fs.symlinkSync(target, path[, type])

    • target — |
    • path — |
    • type —

    Синхронный symlink(2) . Возвращает undefined.

    fs.truncate(path, len, callback)

    • path — |
    • len — (по умолчанию 0 )
    • callback —

    Асинхронный truncate(2) . Никакие другие аргументы кроме возможного исключения не заданы завершающему обратному вызову. Дескриптор файла также может быть передан в качестве первого аргумента. В этом случае вызывается fs.ftruncate() .

    fs.truncateSync(path, len)

    • path — |
    • len — (по умолчанию 0 )

    Синхронный truncate(2) . Показывает undefined.

    fs.unlink(path, callback)

    • path — |
    • callback —

    Асинхронный unlink(2 ). Никакие другие аргументы кроме возможного исключения не заданы завершающему обратному вызову.

    fs.unlinkSync(path)

    Синхронный unlink(2) . Показывает undefined.

    fs.unwatchFile(filename[, listener])

    • filename — |
    • listener —

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

    В противном случае, все слушатели будут удалены, и вы фактически перестаете отслеживать filename .

    Вызов fs.unwatchFile() с именем файла, который не отслеживается является холостой (пустой) командой, а не ошибкой.

    Обратите внимание, что fs.watch() более эффективен чем fs.watchFile() и fs.unwatchFile() . fs.watch() должен быть использован вместо fs.watchFile() и fs.unwatchFile() когда это возможно.

    fs.utimes(path, atime, mtime, callback)

    • path — |
    • atime —
    • mtime —
    • callback —

    Изменение временных файла на который ссылается путь.

    Примечание: аргументы atime и mtime следующих смежных функций следуют следующим правилам:

    Если значение является исчислимой строкой, как например ‘123456789’ , то значение будет преобразовано в соответствующее число.

    Если значение равно NaN ((not a number) не число в арифметике с плавающей запятой (точкой)) или бесконечность, то значение будет преобразовано в Date.now() .

    fs.utimesSync(path, atime, mtime)

    • path — |
    • atime —
    • mtime —

    Синхронная версия fs.utimes() . Возвращает undefined.

    fs.watch(filename[, options][, listener])

    • path — |
    • options — |
      • persistent — . Указывает, должен ли процесс продолжается до тех пор, пока файлы отслеживаются. (По умолчанию — true )
      • recursive — Указывает, должны ли отслеживаться все подкаталоги, или только текущий каталог. Применяется, когда вы указываете каталог, и только на поддерживаемых платформах (см предупреждения). (По умолчанию — false )
      • encoding — Задает символьную кодировку, которая будет использоваться для имени файла, переданного обработчику. (По умолчанию — ‘UTF-8 ‘).
      • listener —

    Следит за изменениями в имени файла, где имя файла либо файл либо каталог. Возвращаемый объект является fs.FSWatcher .

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

    Обратный вызов обработчика событий получает два аргумента ( eventType , filename ). eventType это либо ‘rename’ (переименовать) либо ‘change’ (изменить), и filename — это имя того файла, который вызвал событие.

    Пожалуйста, обратите внимание, что обработчик обратного вызова присоединяется к событию ‘change’ , запущенному fs.FSWatcher , но они не являются одним и тем же.

    Предупреждения

    Интерфейс прикладного программирования fs.watch API не на 100% совместим с разными платформами, и недоступен в некоторых ситуациях.

    Рекурсивная опция поддерживается только на OS X и Windows.

    Доступность

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

    • В системах Linux, использует inotify
    • В системах BSD, это использует kqueue
    • На OS X, использует kqueue для файлов и FSEvents для каталогов.
    • В системах SunOS (в том числе Solaris и SmartOS), это использует eventports.
    • В системах Windows, эта функция зависит от ReadDirectoryChangesW.
    • В системах AIX, эта функция зависит от AHAFS, который должен быть включен.

    Если базовая функция недоступна по какой-то причине, то fs.watch не сможет функционировать.

    Например, просмотр файлов или каталогов может быть ненадежным, а в некоторых случаях невозможным, на сетевых файловых системах ( NFS , SMB и т.д.), или хост файловых системах при использовании программного обеспечения для виртуализации, таких как Vagrant , Docker и т.д.

    Однако Вы все еще можете использовать fs.watchFile , который использует stat полинг ((последовательный) опрос, метод контроля последовательности доступа к среде передачи передающих устройств, при котором периферийным станциям посылается запрос, предлагающий передать имеющиеся данные), но он медленнее и менее надежен.

    Индексные дескрипторы

    В системах Linux и OS X, fs.watch() определяет путь к inode и отслеживает inode.

    Если отслеживаемый путь удален или создан заново, то ему присваивается новый inode.

    Отслеживание создаст событие для удаления, но все равно будет продолжать отслеживание оригинального inode. События для нового inode не будут созданы. Так и должно происходить.

    Аргумент имени файла

    Предоставление аргумента filename в обратном вызове поддерживается только на Linux и Windows . Даже на поддерживаемых платформах, filename не всегда будет предоставлен. Таким образом, не считается, что аргумент filename всегда предоставляется в обратном вызове, и имеет логику (последовательность операций, выполняемых программно) возврата в исходный режим, если он равен нулю.

    fs.watchFile(filename[, options], listener)

    • filename — |
    • options —
      • persistent —
      • interval —
    • listener —

    Следит за изменениями в filename . Обработчик обратного вызова будет вызываться каждый раз, когда происходит обращение к файлу.

    Аргумент options может не приниматься во внимание. Если он предоставляется, то он должен быть объектом. Объект options может содержать persistent с булево логическим именем, указывающее, должен ли этот процесс продолжается до тех пор, пока файлы отслеживаются. Объект options может указывать ( interval ) свойство интервала, указывающее на то, как часто цель должна быть опрошена в миллисекундах.

    Обработчик listener получает два аргумента : текущий объект stat и предыдущий объект stat :

    Эти объекты stat являются экземплярами fs.stat .

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

    Примечание: когда результат операции fs.watchFile приводит к ошибке ENOENT то он будет ссылаться на обработчик только один раз, при этом все поля обнуляются (или для дат, эпоха Unix).

    В операционной системе Windows поля blksize и blocks будут undefined (неопределенными), вместо zero (нуля).

    Если файл создан позже, то обработчик будет вызван еще раз с последними объектами stat . Это изменение в функциональности начиная с версии V0.10.

    Обратите внимание: fs.watch() более эффективен чем fs.watchFile и fs.unwatchFile . fs.watch должен быть использован вместо fs.watchFile и fs.unwatchFile в тех случаях когда это возможно.

    fs.write(fd, buffer, offset, length[, position], callback)

    • fd —
    • buffer — |
    • offset —
    • length —
    • position —
    • callback —

    Запись buffer в файл, указанный с помощью fd .
    offset и length определяют часть буфера для записи.

    position относится к смещение от начала файла, в котором эти данные должны быть записаны.

    Если typeof position !== ‘number’ , данные будут записаны в текущей позиции. См pwrite (2) .

    Обратному вызову будет дано три аргумента ( err , written , buffer ), где written указывает, сколько байтов были записано от buffer . Обратите внимание, что небезопасно использовать fs.write несколько раз на том же файле, не дожидаясь обратного вызова.

    Для этого сценария, настоятельно рекомендуется использовать fs.createWriteStream . В системе Linux, позиционные записи не работают, если файл открыт в режиме добавления. Ядро игнорирует аргумент position и всегда добавляет данные в конец файла.

    fs.write(fd, data[, position[, encoding]], callback)

    • fd —
    • data — |
    • position —
    • encoding —
    • callback —

    Записывает data (Данные) в файл, указанный с помощью fd .

    Если data не экземпляр Buffer , то значение будет приведено к строке.

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

    Если typeof position !== ‘number’ то данные будут записаны в текущей позиции. См pwrite (2) .

    encoding является ожидаемой строкой кодирования.

    Обратный вызов получит три аргумента ( err , written , string ), где written определяет, сколько байтов должны быть записано в переданную строку. Обратите внимание, что записанные байты не являются тем же самым что и символы строки. См Buffer.byteLength .

    В отличие от записи в буфер при, должна быть записана вся строка. Ни одна подстрока не может быть указана. Это происходит потому, что смещение в байтах полученных данных не может быть таким же, что и смещение в строке.

    Обратите внимание, что небезопасно использовать fs.write несколько раз на одном том же файле, не дожидаясь обратного вызова. Для этого сценария, настоятельно рекомендуется fs.createWriteStream.

    В Linux, позиционные записи не работают, если файл открыт в режиме добавления. Ядро игнорирует позицию аргумента и всегда добавляет данные в конец файла.

    fs.writeFile(file, data[, options], callback)

    • file — | | имя файла или файловый дескриптор
    • data — |
    • options — |
      • encoding — | (По умолчанию ‘utf8’ )
      • mode — (По умолчанию 0o666 )
      • flag — (По умолчанию ‘w’ )
    • callback —

    Асинхронно записывает данные в файл, заменяя файл, если он уже существует. data может быть строкой или буфером. Опция ENCODING игнорируется, если data является буфером. По умолчанию это ‘UTF-8’ .

    Пример:

    Если options является строкой то она определяет кодирование.

    Пример:

    Любой заданный дескриптор файла должен поддерживать запись.

    Обратите внимание, что это небезопасно использовать fs.writeFile несколько раз на том же файле, не дожидаясь обратного вызова. Для этого сценария, настоятельно рекомендуется fs.createWriteStream .

    Обратите внимание:

    Если дескриптор файла задан как файл, то он не будет автоматически закрыт.

    fs.writeFileSync(file, data[, options])

    • file — | | имя файла или файловый дескриптор
    • data — |
    • options — |
      • encoding — | (По умолчанию ‘utf8’ )
      • mode — (По умолчанию 0o666 )
      • flag — (По умолчанию ‘w’ )

    Синхронная версия fs.writeFile() . Возвращает undefined.

    fs.writeSync(fd, buffer, offset, length[, position])

    • fd —
    • buffer — |
    • offset —
    • length —
    • position —

    fs.writeSync(fd, data[, position[, encoding]])

    Node.js: работа с файлами

    Обход файлов

    Подключение модуля fs
    var fs = require(‘fs’);

    Методы модуля
    fs.readdir(path, function(err, files)) — возвращает массив папок и файлов, содержащихся в дирректории (асинхронный)
    fs.stat(path, function(err, state)) — возвращает объект fs.Stats , содержащий информацию о файле (асинхронный)

    Методы объекта fs.Stats
    isFile()
    isDirectory()
    isBlockDevice()
    isCharacterDevice()
    isSymbolicLink()
    isFIFO()
    isSocket()

    Чтение файла
    fs.readFileSync(«file.txt», «utf8»)
    fs.readFile(«file.txt», «utf8», function(error,data)< >)

    Запись файла (перезапись)
    fs.writeFileSync(«file.txt», «Hello, world!»)
    fs.writeFile(«file.txt», «Hello, world!»)
    fs.writeFile(«file.txt», «Hello, world!», function(error)< >)

    Запись файла(дозапись)
    fs.appendFileSync(«file.txt», «Hello, world!»);
    fs.appendFile(«file.txt», «Hello, world!», function(error) <
    var data = fs.readFileSync(«file.txt», «utf8»);
    console.log(data);
    >);

    Рекурсивный обход директорий (асинхронный)

    Работа с файловой системой

    Всем привет) Прошу помочь разобраться в работе с файловой системой на ноде. Искал инфу в официальной документации http://nodejs.org/api/fs.html , а так же на некоторых других сайтах. И появилось несколько вопросов.

    Этот метод прекрасно работает, но бродив по сети, я наткнулся на другой код(этот метод также есть в офф доке, но он там плохо прокомментирован):

    Так в чём разница? На мой взгляд лучше использовать первый вариант, т.к. в нём совершается меньше операций, да и кода тоже меньше. Но так ли это?

    1. Как перемещать файлы/папки?
    2. Как определить размер файла?

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

    2 ответа 2

    fs.open используется для открытия файлового дескриптора ( в доках, все функции в аргументах которой есть переменная fd — ожидают именно его, с т.з. JavaScript’a — файловый дескриптор это всего-навсего целое число ) и дальнейшей работы с ним, fs.writeFile — строго для записи в файл. Дескриптор вы можете открыть и не закрывать, т.е., получив file_handle ( он же fd ), можете легко и просто писать и читать.

    Дабы было более понятно — представьте что writeFile — просто утилита, возможности которой заканчиваются на записи в файл, т.е. — мы не имеем никакого доступа ни к его статистике, не можем его просмотреть, удалить и т.д, все что мы умеем — писать в файл, к тому-же, после записи — утилита умирает ( т.е. мы имеем возможность строго единичной записи ). Во втором же случае, грубо говоря — мы открыли некий редактор и можем все — читать, смотреть инфу о файле, писать и т.д. ( это если грубо 🙂 ). Только нельзя забывать «его» закрывать.

    ITNote

    Очень полезны при написание скриптов на Node.js, но крайне НЕ РЕКОМЕНДУЕТСЯ в серверных приложениях.
    Узелки на память.

    Список комманд

    • fs.existsSync(path) — Проверить существование файла
    • fs.mkdirSync(path[, mode]) — создать каталог
    • fs.rmdirSync(path) — удалить каталог
    • fs.unlinkSync(path) — удалить файл
    • fs.readdirSync(path[, options]) — список файлов\подкаталогов в каталоге
    • fs.mkdtempSync(prefix[, options]) — Создать временный каталог
    • fs.writeFileSync(file, data[, options]) — создает новый файл или перезаписывает существующий
    • fs.appendFileSync(file, data[, options]) — дописать данные в конец файла
    • fs.readFileSync(file[, options]) — прочитать содержимое файла
    • fs.renameSync(oldPath, newPath) — переименовать файл
    • fs.lstatSync(path) — Информация о файле
    • fs.openSync(path, flags[, mode]) — открыть файл. Описание режимов ниже
    • fs.readSync(fd, buffer, offset, length, position) — побайтово прочитать файл открытый через fs.openSync
    • path.basename — получить имя файла
    • path.dirname — получить каталог из полного пути
    • path.extname — получить расширение файла

    Режимы открытия файла:

    • w‘ — Открыть файл для записи. Создается если нету или обрезается до нулевой длинны если есть.
    • wx‘ — Тоже что и ‘w’, но вызывает исключение если файл есть.
    • w+‘ — Открыть для чтения и записи. Файл создается если его не было или обрезается до нулевого если есть.
    • wx+‘ — Тоже что и ‘w+’, но вызывает исключение если файл есть.
    • a‘ — Открыть файл для добавления. Файл создается его не было.
    • ax‘ — Тоже что и ‘a’, но вызывает исключение если файл есть.
    • a+‘ — Открыть для чтения и добавления. Файл создается если его не было.
    • ax+‘ — Тоже что и ‘a+’, но вызывает исключение если файл есть.

    Удалить каталог, который не пуст

    В моем приложении Node мне нужно удалить каталог с несколькими файлами, но fs.rmdir работает только в пустых каталогах. Как я могу это сделать?

    Для этого существует модуль под названием rimraf (https://npmjs.org/package/rimraf). Он обеспечивает ту же функциональность, что и rm -Rf

    Асинхронное использование:

    Синхронизация использования:

    Удалить папку синхронно

    Большинство людей, использующих fs с Node.js, хотели бы, чтобы функции были близки к «Unix-способу» работы с файлами. Я использую fs-extra, чтобы принести все классные вещи:

    fs-extra содержит методы, которые не включены в пакет vanilla Node.js fs. Такие как mkdir -p, cp -r и rm -r f.

    Более того, fs-extra — капля на замену родным fs. Все методы в fs не изменены и привязаны к нему. Это означает, что вы можете заменить fs на fs-extra:

    И тогда вы можете удалить папку следующим образом:

    Использует path.join для лучшего кроссплатформенного опыта. Так что не забывайте требовать этого.

    Также переименована функция в rimraf 😉

    По состоянию на 2020 год.

    С Node.js 12.10 вы, наконец, можете сделать простое:

    Опция recursive рекурсивно удаляет все это.

    Вот асинхронная версия ответа @SharpCoder

    Я написал эту функцию под названием remove folder. Он будет рекурсивно удалять все файлы и папки в определенном месте. Единственный требуемый пакет — асинхронный.

    Я обычно не воскрешаю старые темы, но здесь есть много чего, и без ответа, все это кажется мне слишком сложным.

    Во-первых, в современном Node (> = v8.0.0) вы можете упростить процесс, используя только базовые модули узла, полностью асинхронные, и распараллеливать одновременное связывание файлов в одной функции из пяти строк и при этом сохранять читабельность:

    С другой стороны, защита для атак обхода пути не подходит для этой функции, поскольку

    1. Это выходит за рамки, основанные на принципе единой ответственности.
    2. Должен быть обработан вызывающей стороной, а не этой функцией. Это похоже на командную строку rm -rf в том, что она принимает аргумент и позволяет пользователю rm -rf / , если его попросят. Сценарий должен защищать не саму программу rm .
    3. Эта функция не сможет определить такую атаку, поскольку у нее нет системы отсчета. Опять же, это ответственность вызывающего абонента, который будет иметь контекст намерения, который предоставит ему ссылку для сравнения обхода пути.
    4. Сим-ссылки не являются проблемой, так как .isDirectory() является false для сим-ссылок и не связаны, не повторяются.

    И последнее, но не менее важное: существует редкое условие состязания, при котором рекурсия может привести к ошибке, если одна из записей была отсоединена или удалена вне этого сценария как раз в нужное время, пока выполняется эта рекурсия. Поскольку этот сценарий не является типичным в большинстве сред, его, вероятно, можно пропустить. Однако при необходимости (для некоторых крайних случаев) эту проблему можно решить с помощью этого немного более сложного примера:

    ОБНОВЛЕНИЕ: Сделать isDirectory() функцией. Удалите актуальный каталог в конце. Исправить пропущенную рекурсию.

    Node.js файловой системы

    Node.js обеспечивает аналогичный набор UNIX (POSIX) стандартных операций с файлами API. Узел Импорт файлов Системный модуль (фс) синтаксис выглядит следующим образом:

    Асинхронный и синхронный

    Node.js файловая система (фс Module) методы модуля имеют асинхронные и синхронные версии, такие как чтение содержание функции документа имеет асинхронный fs.readFile () и синхронизация fs.readFileSync ().

    Асинхронные функции метод последнего параметра функции обратного вызова, первый аргумент функции обратного вызова содержит сообщение об ошибке (ошибка).

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

    примеров

    Создание input.txt файл, следующим образом:

    Создание file.js файл, следующим образом:

    Приведенный выше код выполняется следующим образом:

    Далее, давайте понять конкретные методы в рамках файловой системы Node.js.

    Открыть файл

    грамматика

    Ниже приведен открытый файл в асинхронном режиме синтаксиса:

    параметры

    Параметры следующим образом:

    путь — путь к файлу.

    флаги — открыть файл поведения.Конкретные значения описаны ниже.

    режим — установить режим доступа к файлу (разрешений), создать файл разрешения по умолчанию 0666 (чтение, запись).

    Обратный вызов — функция обратного вызова принимает два параметра, например: обратный вызов (ERR, FD).

    Параметр флаги могут быть следующие значения:

    флаг описание
    R Откройте файл в режиме чтения. Если файл не существует бросок.
    г + Откройте файл в режиме чтения-записи. Если файл не существует бросок.
    Р.С. Прочитайте файл в синхронном режиме.
    RS + Синхронизированным образом для чтения и записи файлов.
    вес Откройте файл в режиме записи, если файл не существует, он будет создан.
    WX Подобное ‘ш’, но если файл путь существует, сбой записи файла.
    ш + Откройте файл в режиме чтения-записи, если файл не существует, он будет создан.
    WX + Аналогично ‘ш +’, но если файл существует путь, файл чтения и записи не удалась.
    Откройте файл в режиме добавления, если файл не существует, он будет создан.
    топор Подобно ‘A’, но если файл существует путь, прикрепление файла не удается.
    а + Чтобы прочитать файл, открытый в режиме добавления, если файл не существует, он будет создан.
    ах + Подобный «A +», но если файл существует путь, файл читается дополнительные сбои.

    примеров

    Далее мы создаем file.js файл и открывает файл input.txt читать и писать код следующим образом:

    Приведенный выше код выполняется следующим образом:

    Получение информации о файле

    грамматика

    Следующие документы для получения информации с помощью асинхронного синтаксиса режима:

    параметры

    Параметры следующим образом:

    путь — путь к файлу.

    Обратный вызов — функция обратного вызова принимает два параметра, например:(ERR, статистика), статистика являются fs.Stats объекта.

    После того, как fs.stat (путь) исполнения, экземпляр класса будет возвращен к своей функции обратного вызова статистике. Вы можете определить соответствующие атрибуты файла по статистике класс предоставляет метод. Например, чтобы определить, являются ли файлы:

    Методы класса статистика являются:

    способ описание
    stats.isFile () Если файл возвращает истину, в противном случае она возвращает ложь.
    stats.isDirectory () Если каталог возвращает истину, в противном случае она возвращает ложь.
    stats.isBlockDevice () Если блочное устройство возвращает истину, в противном случае она возвращает ложь.
    stats.isCharacterDevice () Если устройство символ возвращает истину, в противном случае возвращает ложь.
    stats.isSymbolicLink () Если это мягкая ссылка возвращает истину, в противном случае она возвращает ложь.
    stats.isFIFO () Если FIFO, возвращает истину, в противном случае она возвращает ложь. FIFO представляет собой особый тип командного конвейера UNIX.
    stats.isSocket () Если сокет возвращает истину, в противном случае она возвращает ложь.

    примеров

    Далее мы создаем file.js файл, код выглядит следующим образом:

    Приведенный выше код выполняется следующим образом:

    Запись в файл

    грамматика

    Далее записывается в файл в асинхронном режиме синтаксиса:

    Если файл существует, метод записывает содержимое будет перезаписать старое содержимое файла.

    параметры

    Параметры следующим образом:

    путь — путь к файлу.

    данные — данные , которые должны быть записаны в файл, который может быть String (String) или буфер (поток) объект.

    Параметры — Этот параметр представляет собой объект , который содержит <кодирования, мода, флаг>.Кодировка по умолчанию utf8, 0666, флаг ‘W’

    Обратный вызов — функция обратного вызова, функция обратного вызова содержит только сообщения об ошибках аргументы (ERR), возвращает при записи терпит неудачу.

    примеров

    Далее мы создаем file.js файл, код выглядит следующим образом:

    Приведенный выше код выполняется следующим образом:

    Прочитайте файл

    грамматика

    Здесь Асинхронный режим для чтения синтаксис файла:

    Этот метод использует дескриптор файла для чтения файла.

    параметры

    Параметры следующим образом:

    FD — обратно через fs.open метод () файловых дескрипторов.

    буфер — данные записываются в буфер.

    смещение — смещение буфера записи записывается.

    Длина — количество байтов , считанных из файла.

    положение — начало файла считывается, если позиция имеет нулевое значение, считывается из текущей позиции указателя файла.

    Обратный вызов — функция обратного вызова принимает три аргумента : заблуждаетесь, BytesRead, буфер, ERR сообщение об ошибке, BytesRead указывает количество байтов для чтения, буфер объект буфера.

    примеров

    input.txt содержимое файла:

    Далее мы создаем file.js файл, код выглядит следующим образом:

    Приведенный выше код выполняется следующим образом:

    Закройте файл

    грамматика

    Ниже приводится замкнутый файл в асинхронном режиме синтаксиса:

    Этот метод использует дескриптор файла для чтения файла.

    параметры

    Параметры следующим образом:

    FD — обратно через fs.open метод () файловых дескрипторов.

    Обратный вызов — функция обратного вызова не имеет параметров.

    примеров

    input.txt содержимое файла:

    Далее мы создаем file.js файл, код выглядит следующим образом:

    Приведенный выше код выполняется следующим образом:

    Intercept файл

    грамматика

    Ниже приведен синтаксис асинхронный режим перехвата файла:

    Этот метод использует дескриптор файла для чтения файла.

    параметры

    Параметры следующим образом:

    FD — обратно через fs.open метод () файловых дескрипторов.

    Len — длина содержимого файла перехваченного.

    Обратный вызов — функция обратного вызова не имеет параметров.

    примеров

    input.txt содержимое файла:

    Далее мы создаем file.js файл, код выглядит следующим образом:

    Приведенный выше код выполняется следующим образом:

    Удалить файлы

    грамматика

    Ниже приведен синтаксис для удаления файла:

    параметры

    Параметры следующим образом:

    путь — путь к файлу.

    Обратный вызов — функция обратного вызова не имеет параметров.

    примеров

    input.txt содержимое файла:

    Далее мы создаем file.js файл, код выглядит следующим образом:

    Приведенный выше код выполняется следующим образом:

    См input.txt файл еще раз и не нашел больше не существует.

    Создание каталога

    грамматика

    Ниже приведен синтаксис для создания каталога:

    параметры

    Параметры следующим образом:

    путь — путь к файлу.

    режим — установить права доступа для каталога, по умолчанию 0777.

    Обратный вызов — функция обратного вызова не имеет параметров.

    примеров

    Далее мы создаем file.js файл, код выглядит следующим образом:

    Приведенный выше код выполняется следующим образом:

    Читайте каталог

    грамматика

    Ниже приведен синтаксис для чтения каталога:

    параметры

    Параметры следующим образом:

    путь — путь к файлу.

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

    примеров

    Далее мы создаем file.js файл, код выглядит следующим образом:

    Приведенный выше код выполняется следующим образом:

    удалить каталог

    грамматика

    Ниже приведен синтаксис для удаления каталога:

    параметры

    Параметры следующим образом:

    путь — путь к файлу.

    Обратный вызов — функция обратного вызова не имеет параметров.

    примеров

    Далее мы создаем file.js файл, код выглядит следующим образом:

    Приведенный выше код выполняется следующим образом:

    Эталонный метод файла модуля

    Ниже приведен список файлов, таким же образом, Node.js модули:

    Нет. Метод и описание
    1 fs.rename (OLDPATH, NEWPATH, обратный вызов)
    Асинхронный Rename (). Функция обратного вызова не имеет параметров, но может бросить.
    2 fs.ftruncate (FD, Len, обратный вызов)
    Асинхронный ftruncate (). Функция обратного вызова не имеет параметров, но может бросить.
    3 fs.ftruncateSync (FD, Len)
    Синхронизация ftruncate ()
    4 fs.truncate (путь, Len, обратный вызов)
    Асинхронный усечение (). Функция обратного вызова не имеет параметров, но может бросить.
    5 fs.truncateSync (путь, длина)
    Синхронизация усечение ()
    6 fs.chown (путь, UID, GID, обратный вызов)
    Асинхронный Чаун (). Функция обратного вызова не имеет параметров, но может бросить.
    7 fs.chownSync (путь, UID, GID)
    Синхронизация Чаун ()
    8 fs.fchown (FD, UID, GID, обратный вызов)
    Асинхронный fchown (). Функция обратного вызова не имеет параметров, но может бросить.
    9 fs.fchownSync (FD, UID, GID)
    Синхронизация fchown ()
    10 fs.lchown (путь, UID, GID, обратный вызов)
    Асинхронный lchown (). Функция обратного вызова не имеет параметров, но может бросить.
    11 fs.lchownSync (путь, UID, GID)
    Синхронизация lchown ()
    12 fs.chmod (путь, режим, обратный вызов)
    Асинхронный CHMOD (). Функция обратного вызова не имеет параметров, но может бросить.
    13 fs.chmodSync (путь, режим)
    Синхронизация CHMOD ().
    14 fs.fchmod (FD, режим, обратный вызов)
    Асинхронный fchmod (). Функция обратного вызова не имеет параметров, но может бросить.
    15 fs.fchmodSync (FD, режим)
    Синхронизация fchmod ().
    16 fs.lchmod (путь, режим, обратный вызов)
    Асинхронный lchmod (). Функция обратного вызова не имеет параметров, но может бросить. Доступно только на Mac OS X.
    17 fs.lchmodSync (путь, режим)
    Синхронизация lchmod ().
    18 fs.stat (путь, обратный вызов)
    Асинхронный стат (). Функция обратного вызова принимает два аргумента: заблуждаетесь, статистика, статистика являются fs.Stats объекта.
    19 fs.lstat (путь, обратный вызов)
    Асинхронный lstat (). Функция обратного вызова принимает два аргумента: заблуждаетесь, статистика, статистика являются fs.Stats объекта.
    20 fs.fstat (FD, обратный вызов)
    Асинхронный fstat (). Функция обратного вызова принимает два аргумента: заблуждаетесь, статистика, статистика являются fs.Stats объекта.
    21 fs.statSync (путь)
    Синхронизация стат (). Fs.Stats возвращают экземпляр.
    22 fs.lstatSync (путь)
    Синхронизация lstat (). Fs.Stats возвращают экземпляр.
    23 fs.fstatSync (FD)
    Синхронизация fstat (). Fs.Stats возвращают экземпляр.
    24 fs.link (srcpath, dstpath, обратный вызов)
    Асинхронный линия связи (). Функция обратного вызова не имеет параметров, но может бросить.
    25 fs.linkSync (srcpath, dstpath)
    ссылка синхронизации ().
    26 fs.symlink (srcpath, dstpath [, тип ], обратный вызов)
    Асинхронный символьная (). Функция обратного вызова не имеет параметров, но может бросить. Параметр типа может быть установлен в ‘директории’, ‘файл’, или » перехода ( ‘файл’ по умолчанию).
    27 fs.symlinkSync (srcpath, dstpath [, тип ])
    Синхронизация символьная ().
    28 fs.readlink (путь, обратный вызов)
    Асинхронный readlink (). Функция обратного вызова принимает два аргумента: заблуждаетесь, linkString.
    29 fs.realpath (путь [кэш], обратный вызов)
    Асинхронный Realpath (). Функция обратного вызова принимает два аргумента: заблуждаетесь, resolvedPath.
    30 fs.realpathSync (путь [кэш])
    Синхронный Realpath (). Возвращает абсолютный путь.
    31 fs.unlink (путь, обратный вызов)
    Асинхронный Разорвать связь (). Функция обратного вызова не имеет параметров, но может бросить.
    32 fs.unlinkSync (путь)
    Синхронизация Разорвать связь ().
    33 fs.rmdir (путь, обратный вызов)
    Асинхронный RmDir (). Функция обратного вызова не имеет параметров, но может бросить.
    34 fs.rmdirSync (путь)
    Синхронизация RmDir ().
    35 fs.mkdir (путь [режим], обратный вызов)
    S Асинхронный MkDir (2). Функция обратного вызова не имеет параметров, но может бросить. Режим по умолчанию 0777.
    36 fs.mkdirSync (путь [режим])
    Синхронизация MkDir ().
    37 fs.readdir (путь, обратный вызов)
    Асинхронный READDIR (3). Прочитайте содержимое каталога.
    38 fs.readdirSync (путь)
    Синхронизация READDIR (). Возвращает массив списка файлов.
    39 fs.close (FD, обратный вызов)
    Асинхронный близко (). Функция обратного вызова не имеет параметров, но может бросить.
    40 fs.closeSync (FD)
    Синхронизация близко ().
    41 fs.open (путь, флаги [режим ], обратный вызов)
    Асинхронный открыть файл.
    42 fs.openSync (путь, флаги [, режим ])
    Синхронная версия fs.open ().
    43 fs.utimes (путь, Atime, время изменения, обратный вызов)
    44 fs.utimesSync (путь, Atime, время изменения)
    Изменение временных меток файла, файл по пути к файлу указанного.
    45 fs.futimes (FD, Atime, время изменения, обратный вызов)
    46 fs.futimesSync (FD, Atime, время изменения)
    временные метки файла изменений, указанных в дескрипторе файла.
    47 fs.fsync (FD, обратный вызов)
    Асинхронный FSYNC. Функция обратного вызова не имеет параметров, но может бросить.
    48 fs.fsyncSync (FD)
    Синхронизация FSYNC.
    49 fs.write (FD, буфер, смещение, длина [, позиция], обратный вызов)
    Содержимое буфера записи в файл, указанный дескриптором файла.
    50 fs.write (FD, данные [, позиция [, кодирование]], обратный вызов)
    Записать в содержимое файла на дескриптор файла ФД.
    51 fs.writeSync (FD, буфер, смещение, длина [, позиция])
    Синхронная версия fs.write ().
    52 fs.writeSync (FD, данные [, позиция [, кодирование]])
    Синхронная версия fs.write ().
    53 fs.read (FD, буфер, смещение, длина, положение, обратный вызов)
    Прочитайте содержание документов на дескриптор файла ФД.
    54 fs.readSync (FD, буфер, смещение, длина, положение)
    Синхронная версия fs.read.
    55 fs.readFile (имя файла [, опции], обратный вызов)
    Асинхронный прочитать содержимое файла.
    56 fs.readFileSync (имя файла [, опции])
    Асинхронный запись для содержимого файла.
    58 fs.writeFileSync (имя файла, данные [, опции ])
    Синхронная версия fs.writeFile.
    59 fs.appendFile (имя файла, данные [, опции ], обратный вызов)
    Асинхронные содержание дополнительного файла.
    60 fs.appendFileSync (имя файла, данные [, опции ])
    Синхронная версия fs.appendFile.
    61 fs.watchFile (имя файла [, опции], слушатель)
    Изменить представление файла.
    62 fs.unwatchFile (имя файла [, слушатель])
    Остановить просмотр изменения имени файла.
    63 fs.watch (имя файла [, опции] [ , слушатель])
    Проверьте изменения имени файла, имя файла может быть файл или каталог. Назад fs.FSWatcher объект.
    64 fs.exists (путь, обратный вызов)
    Обнаружить данный путь существует.
    65 fs.existsSync (путь)
    Синхронные версия fs.exists.
    66 fs.access (путь [режим], обратный вызов)
    Проверяет, является ли указанный путь разрешения пользователя.
    67 fs.accessSync (путь [режим])
    Синхронная версия fs.access.
    68 fs.createReadStream (путь [, опции])
    Назад ReadStream объект.
    69 fs.createWriteStream (путь [, опции])
    Назад WriteStream объект.
    70 fs.symlink (srcpath, dstpath [, тип ], обратный вызов)
    Асинхронный символьная (). Функция обратного вызова не имеет параметров, но может бросить.

    Для получения более подробной информации, проверить на официальном веб — модуля файла Описание: Файл системы .

    Привет!

    Вы запросили » +
    request.url + «

    Запустив скрипт на своей машины, вы можете направить браузер по адресу localhost:8000/hello, таким образом создав запрос к серверу. Он ответит небольшой HTML-страницей.

    Функция, передаваемая как аргумент к createServer, вызывается при каждой попытке соединения с сервером. Переменные request и response – объекты, представляющие входные и выходные данные. Первый содержит информацию по запросу, например свойство url содержит URL запроса.

    Чтобы отправить что-то назад, используются методы объекта response. Первый, writeHead, пишет заголовки ответа (см. главу 17). Вы даёте ему код статуса (в этом случае 200 для “OK”) и объект, содержащий значения заголовков. Здесь мы сообщаем клиенту, что он должен ждать документ HTML.

    Затем идёт тело ответа (сам документ), отправляемое через response.write. Этот метод можно вызывать несколько раз, если хотите отправлять ответ по кускам, к примеру, передавая потоковые данные по мере их поступления. Наконец, response.end сигнализирует конец ответа.

    Вызов server.listen заставляет сервер слушать запросы на порту 8000. Поэтому вам надо в браузере заходить на localhost:8000, а не просто на localhost (где портом по умолчанию будет 80).

    Для остановки такого скрипта Node, который не завершается автоматически, потому что ожидает следующих событий (в данном случае, соединений), надо нажать Ctrl-C.

    Настоящий веб-сервер делает гораздо больше того, что описано в примере. Он смотрит на метод запроса (свойство method), чтобы понять, какое действие пытается выполнить клиент, и на URL запроса, чтобы понять, на каком ресурсе это действие должно выполняться. Далее вы увидите более продвинутую версию сервера.

    Чтобы сделать HTTP-клиент, мы можем использовать функцию модуля “http” request.

    var http = require(«http»);
    var request = http.request( <
    hostname: «eloquentjavascript.net»,
    path: «/20_node.html»,
    method: «GET»,
    headers:
    >, function(response) <
    console.log(«Сервис ответил с кодом «,
    response.statusCode);
    >);
    request.end();

    Первый аргумент request настраивает запрос, объясняя Node, с каким сервером будем общаться, какой путь будет у запроса, какой метод использовать, и т.д. Второй – функция. которую надо будет вызвать по окончанию запроса. Ей передаётся объект response, в котором содержится вся информация по ответу – к примеру, код статуса.

    Как и объект response сервера, объект, возвращаемый request, позволяет передавать данные методом write и заканчивать запрос методом end. В примере не используется write, потому что запросы GET не должны содержать данных в теле.

    Для запросов на безопасные URL (HTTPS), Node предлагает модуль https, в котором есть своя функция запроса, схожая с http.request.

    Мы видели два примера потоков в примерах HTTP – объект response, в который сервер может вести запись, и объект request, который возвращается из http.request

    Потоки с возможностью записи – популярная концепция в интерфейсах Node. У всех потоков есть метод write, которому можно передать строку или объект Buffer. Метод end закрывает поток, а при наличии аргумента, выведет перед закрытием кусочек данных. Обоим методам можно задать функцию обратного вызова через дополнительный аргумент, которую они вызовут по окончанию записи или закрытию потока.

    Возможно создать поток, показывающий на файл, при помощи функции fs.createWriteStream. Затем можно использовать метод write для записи в файл по кусочкам, а не целиком, как в fs.writeFile.

    Потоки с возможностью чтения будут чуть сложнее. Как переменная request, переданная функции для обратного вызова в сервере HTTP, так и переменная response, переданная в HTTP-клиенте, являются потоками с возможностью чтения. (Сервер читает запрос и потом пишет ответы, а клиент пишет запрос и читает ответа). Чтение из потока осуществляется через обработчики событий, а не через методы.

    У объектов, создающих события в Node, есть метод on, схожий с методом браузера addEventListener. Вы даёте ему имя события и функцию, и он регистрирует эту функцию, чтоб её вызвали сразу, когда произойдёт событие.

    У потоков с возможностью чтения есть события «data» и «end». Первое происходит при поступлении данных, второе – по окончанию. Эта модель подходит к потоковым данным, которые можно сразу обработать, даже если получен не весь документ. Файл можно прочесть в виде потока через fs.createReadStream.

    Следующий код создаёт сервер, читающий тела запросов и отправляющий их в ответ потоком в виде текста из заглавных букв.

    var http = require(«http»);
    http.createServer(function(request, response) <
    response.writeHead(200, <"Content-Type": "text/plain">);
    request.on(«data», function(chunk) <
    response.write(chunk.toString().toUpperCase());
    >);
    request.on(«end», function() <
    response.end();
    >);
    >).listen(8000);

    Переменная chunk, передаваемая обработчику данных, будет бинарным Buffer, который можно преобразовать в строку, вызвав его метод toString, который декодирует его из кодировки по умолчанию (UTF-8).

    Следующий код, будучи запущенным одновременно с сервером, отправит запрос на сервер и выведет полученный ответ:

    var http = require(«http»);
    var request = http.request( <
    hostname: «localhost»,
    port: 8000,
    method: «POST»
    >, function(response) <
    response.on(«data», function(chunk) <
    process.stdout.write(chunk.toString());
    >);
    >);
    request.end(«Hello server»);

    Пример пишет в process.stdout (стандартный вывод процесса, являющийся потоком с возможностью записи), а не в console.log. Мы не можем использовать console.log, так как он добавляет лишний перевод строки после каждого куска кода – это здесь не нужно.

    Простой файловый сервер

    Давайте скомбинируем наши новые знания о серверах HTTP и работе с файловой системой, и наведём мостик между ними: HTTP-сервер, предоставляющий удалённый доступ к файлам. У такого сервера много вариантов использования. Он позволяет веб-приложениям хранить и делиться данными, или может дать группе людей доступ к набору файлов.

    Когда мы относимся к файлам, как к ресурсам HTTP, методы GET, PUT и DELETE можно использовать для чтения, записи и удаления файлов. Мы будем интерпретировать путь в запросе как путь к файлу.

    Нам не надо открывать доступ ко всей файловой системе, поэтому мы будем интерпретировать эти пути как заданные относительно корневого каталога, и это будет каталог запуска скрипта. Если я запущу сервер из /home/marijn/public/ (или C:Usersmarijnpublic на Windows), то запрос на /file.txt должен указать на /home/marijn/public/file.txt (или C:Usersmarijnpublicfile.txt).

    Программу мы будем строить постепенно, используя объект methods для хранения функций, обрабатывающих разные методы HTTP.

    var http = require(«http»), fs = require(«fs»);

    var methods = Object.create(null);

    http.createServer(function(request, response) <
    function respond(code, body, type) <
    if (!type) type = «text/plain»;
    response.writeHead(code, <"Content-Type": type>);
    if (body && body.pipe)
    body.pipe(response);
    else
    response.end(body);
    >
    if (request.method in methods)
    methods[request.method](urlToPath(request.url),
    respond, request);
    else
    respond(405, «Method » + request.method +
    » not allowed.»);
    >).listen(8000);

    Этот код запустит сервер, возвращающий ошибки 405 – этот код используется для обозначения того, что запрошенный метод сервером не поддерживается.

    Функция respond передаётся функциям, обрабатывающим разные методы, и работает как обратный вызов для окончания запроса. Она принимает код статуса HTTP, тело, и, возможно, тип содержимого. Если переданное тело – поток с возможностью чтения, у него будет метод pipe, который используется для передачи читаемого потока в записываемый. Если нет – предполагается, что это либо null (тело пустое), или строка, и тогда она передаётся напрямую в метод ответа end.

    Чтобы получить путь из URL в запросе, функция urlToPath, используя встроенный модуль Node “url”, разбирает URL. Она принимает имя пути, нечто вроде /file.txt, декодирует, чтобы убрать экранирующие коды %20, и вставляет в начале точку, чтобы получить путь относительно текущего каталога.

    function urlToPath(url) <
    var path = require(«url»).parse(url).pathname;
    return «.» + decodeURIComponent(path);
    >

    Вам кажется, что функция urlToPath небезопасна? Вы правы. Вернёмся к этому вопросу в упражнениях.

    Мы устроим метод GET так, чтобы он возвращал список файлов при чтении директории, и содержимое файла при чтении файла.

    Вопрос на засыпку – какой тип заголовка Content-Type мы должны возвращать, читая файл. Поскольку в файле может быть всё, что угодно, сервер не может просто вернуть один и тот же тип для всех. Но NPM с этим может помочь. Модуль mime (индикаторы типа содержимого файла вроде text/plain также называются MIME types) знает правильный тип для огромного количества расширений файлов.

    Запустив следующую команду npm в директории, где живёт скрипт сервера, вы сможете использовать require(«mime») для запросов к библиотеке типов.

    Когда запрошенного файла не существует, правильным кодом ошибки для этого случая будет 404. Мы будем использовать fs.stat для возврата информации по файлу, чтобы выяснить, есть ли такой файл, и не директория ли это.

    methods.GET = function(path, respond) <
    fs.stat(path, function(error, stats) <
    if (error && error.code == «ENOENT»)
    respond(404, «File not found»);
    else if (error)
    respond(500, error.toString());
    else if (stats.isDirectory())
    fs.readdir(path, function(error, files) <
    if (error)
    respond(500, error.toString());
    else
    respond(200, files.join(«n»));
    >);
    else
    respond(200, fs.createReadStream(path),
    require(«mime»).lookup(path));
    >);
    >;

    Поскольку запросы к диску занимают время, fs.stat работает асинхронно. Когда файла не существует, fs.stat передаст объект error с кодовым свойством «ENOENT» в функцию обратного вызова. Было бы здорово, если бы Node определил разные типы ошибок для разных ошибок, но такого нет. Вместо этого он выдаёт запутанные коды в стиле Unix.

    Все неожиданные ошибки мы будем выдавать с кодом 500, обозначающим, что на сервере проблема – в отличие от кодов, начинающихся на 4, говорящих о проблеме с запросом. В некоторых ситуациях это будет не совсем аккуратно, но для небольшой примерной программы этого будет достаточно.

    Объект stats возвращаемый fs.stat, рассказывает нам о файле всё. Например, size – размер файла, mtime – дата модификации. Здесь нам нужно узнать, директория это или обычный файл – это нам сообщит метод isDirectory.

    Для чтения списка файлов в директории мы используем fs.readdir, и через ещё один обратный вызов, возвращаем его пользователю. Для обычных файлов мы создаём читаемый поток через fs.createReadStream и передаём его в ответ, вместе с типом содержимого, который модуль “mime” выдал для этого файла.

    Код обработки DELETE будет проще:

    methods.DELETE = function(path, respond) <
    fs.stat(path, function(error, stats) <
    if (error && error.code == «ENOENT»)
    respond(204);
    else if (error)
    respond(500, error.toString());
    else if (stats.isDirectory())
    fs.rmdir(path, respondErrorOrNothing(respond));
    else
    fs.unlink(path, respondErrorOrNothing(respond));
    >);
    >;

    Возможно, вам интересно, почему попытка удаления несуществующего файла возвращает статус 204 вместо ошибки. Можно сказать, что при попытке удалить несуществующий файл, так как файла там уже нет, то запрос уже исполнен. Стандарт HTTP поощряет людей делать идемпотентные запросы – то есть такие, при которых многократный повтор одного и того же действия не приводит к разным результатам.

    function respondErrorOrNothing(respond) <
    return function(error) <
    if (error)
    respond(500, error.toString());
    else
    respond(204);
    >;
    >

    Когда ответ HTTP не содержит данных, можно использовать код статуса 204 (“no content”). Так как нам нужно обеспечить функции обратного вызова, которые либо сообщают об ошибки, или возвращают ответ 204 в разных ситуациях, я написал специальную функцию respondErrorOrNothing, которая создаёт такой обратный вызов.

    Вот обработчик запросов PUT:

    methods.PUT = function(path, respond, request) <
    var outStream = fs.createWriteStream(path);
    outStream.on(«error», function(error) <
    respond(500, error.toString());
    >);
    outStream.on(«finish», function() <
    respond(204);
    >);
    request.pipe(outStream);
    >;

    Здесь нам не нужно проверять существование файла – если он есть, мы его просто перезапишем. Опять мы используем pipe для передачи данных из читаемого потока в записываемый, в нашем случае – из запроса в файл. Если создать поток не удаётся, создаётся событие “error”, о чём мы сообщаем в ответе. Когда данные переданы успешно, pipe закроет оба потока, что приведёт к запуску события “finish”. А после этого мы можем отчитаться об успехе с кодом 204.

    Полный скрипт сервера лежит тут: eloquentjavascript.net/code/file_server.js. Его можно скачать и запустить через Node. Конечно, его можно менять и дополнять для решения упражнений или экспериментов.

    Утилита командной строки curl, общедоступная на unix-системах, может использоваться для создания HTTP запросов. Следующий фрагмент тестирует наш сервер. –X используется для задания метода запроса, а –d для включения тела запроса.

    Первый запрос к file.txt завершается с ошибкой, поскольку файла ещё нет. Запрос PUT создаёт файл, и глядите-ка – следующий запрос его успешно получает. После его удаления через DELETE файл снова отсутствует.

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

    Что будет, когда что-то реально выбросит исключение в системе? Мы не используем блоки try, потому оно будет передано на самый верх стека вызовов. В Node это приводит к останову программы и выводу информации об исключении (вместе с отслеживанием стека) на стандартный вывод.

    Поэтому наш сервер будет падать при возникновении проблем в коде – в отличие от проблем с асинхронностью, которые будут переданы как аргументы в функции вызова. Если нам надо обрабатывать все исключения, возникающие при обработке запроса, чтобы мы точно отправили ответ, нам надо добавлять блоки try/catch в каждом обратном вызове.

    Это плохо. Много программ для Node написаны так, чтобы использовать как можно меньше работы с исключениями, подразумевая что в случае возникновения исключения программа не может его обработать, и поэтому надо падать.

    Ещё один подход – использование обещаний, которые были описаны в главе 17. Они ловят исключения, выброшенные функциями обратного вызова и передают их как ошибки. В Node можно загрузить библиотеку promise и использовать её для обработки асинхронных вызовов. Немногие библиотеки Node интегрируют обещания, но обычно их довольно просто обернуть. Отличный модуль “promise” с NPM содержит функцию denodeify, которая берёт асинхронную функцию вроде fs.readFile и преобразовывает её в функцию, возвращающую обещание.

    var Promise = require(«promise»);
    var fs = require(«fs»);

    var readFile = Promise.denodeify(fs.readFile);
    readFile(«file.txt», «utf8»).then(function(content) <
    console.log(«The file contained: » + content);
    >, function(error) <
    console.log(«Failed to read file: » + error);
    >);

    Для сравнения, я написал ещё одну версию файлового сервера с использованием обещаний, которую можно найти на eloquentjavascript.net/code/file_server_promises.js. Она почище, потому что функции теперь могут возвращать результаты, а не назначать обратные вызовы, и исключения передаются неявно.

    Приведу несколько строк оттуда, чтобы продемонстрировать разницу в стилях.

    Объект fsp, использующийся в коде, содержит варианты функций fs с обещаниями, обёрнутыми при помощи Promise.denodeify. Возвращаемый из обработчика метода объект, со свойствами code и body, становится окончательным результатом цепочки обещаний, и он используется для определения того, какой ответ отправить клиенту.

    methods.GET = function(path) <
    return inspectPath(path).then(function(stats) <
    if (!stats) // Does not exist
    return ;
    else if (stats.isDirectory())
    return fsp.readdir(path).then(function(files) <
    return ;
    >);
    else
    return type: require(«mime»).lookup(path),
    body: fs.createReadStream(path)>;
    >);
    >;

    function inspectPath(path) <
    return fsp.stat(path).then(null, function(error) <
    if (error.code == «ENOENT») return null;
    else throw error;
    >);
    >

    Функция inspectPath – простая обёртка вокруг fs.stat, обрабатывающая случай, когда файл не найден. В этом случае мы заменяем ошибку на успех, возвращающий null. Все остальные ошибки можно передавать. Когда обещание, возвращаемое из этих обработчиков, обламывается, сервер отвечает кодом 500.

    Node – отличная простая система, позволяющая запускать JavaScript вне браузера. Изначально она разрабатывалась для работы по сети, чтобы играть роль узла в сети. Но она позволяет делать много всего, и если вы наслаждаетесь программированием на JavaScript, автоматизация ежедневных задач с Node работает отлично.

    NPM предоставляет библиотеки для всего, что вам может прийти в голову (и даже для кое-чего, что вам не придёт в голову), и она позволяет скачивать и устанавливать их простой командой. Node также поставляется с набором встроенных модулей, включая “fs” для работы с файловой системой, и “http” для запуска HTTP серверов и создания HTTP запросов.

    Весь ввод и вывод в Node делается асинхронно, если только вы не используете явно синхронный вариант функции, например fs.readFileSync. Вы предоставляете функции обратного вызова, а Node их вызывает в нужное время, когда операции I/O заканчивают работу.

    И снова согласование содержания

    В главе 17 первое упражнение было посвящено созданию запросов к eloquentjavascript.net/author, спрашивавших разные типы содержимого путём передачи разных заголовков Accept.

    Сделайте это снова, используя функцию Node http.request. Запросите, по крайней мере, типы text/plain, text/html и application/json. Помните, что заголовки запроса можно передавать как объект в свойстве headers, первым аргументом http.request.

    Выведите содержимое каждого ответа.

    Для упрощения доступа к файлам я оставил работать сервер у себя на комьпютере, в директории /home/marijn/public. Однажды я обнаружил, что кто-то получил доступ ко всем моим паролям, которые я хранил в браузере. Что случилось?

    Если вам это непонятно, вспомните функцию urlToPath, которая определялась так:

    function urlToPath(url) <
    var path = require(«url»).parse(url).pathname;
    return «.» + decodeURIComponent(path);
    >

    Теперь вспомните, что пути, передаваемые в функцию “fs”, могут быть относительными. Они могут содержать путь “../” в верхний каталог. Что будет, если клиент отправит запросы на URL вроде следующих:

    Поменяйте функцию urlToPath для устранения подобной проблемы. Примите во внимание, что на Windows Node разрешает как прямые так и обратные слеши для задания путей.

    Кроме этого, помедитируйте над тем фактом, что как только вы выставляете сырую систему в интернет, ошибки в системе могут быть использованы против вас и вашего компьютера.

    Хотя метод DELETE работает и при удалении директорий (через fs.rmdir), пока сервер не предоставляет возможности создания директорий.

    Добавьте поддержку метода MKCOL, который должен создавать директорию через fs.mkdir. MKCOL не является основным методом HTTP, но он существует, именно для этого, в стандарте WebDAV, который содержит расширения HTTP, чтобы использовать его для записи ресурсов, а не только для их чтения.

    Общественное место в сети

    Так как файловый сервер выдаёт любые файлы и даже возвращает правильный заголовок Content-Type, его можно использовать для обслуживания веб-сайта. Так как он разрешает всем удалять и заменять файлы, это был бы интересный сайт – который можно изменять, портить и удалять всем, кто может создать правильный HTTP-запрос. Но это всё равно был бы веб-сайт.

    Напишите простую HTML страницу с простым файлом JavaScript. Разместите их в директории, обслуживаемой сервером и откройте в браузере.

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

    Используйте форму HTML (глава 18) для редактирования файлов, составляющих сайт, позволяя пользователю обновлять их на сервере через HTTP-запросы, как описано в главе 17.

    Начните с одного файла, редактирование которого разрешено. Затем сделайте так, чтобы можно было выбирать файл для редактирования. Используйте тот факт, что наш файловый сервер возвращает списки файлов по запросу директории.

    Не меняйте файлы непосредственно в коде файлового сервера – если вы сделаете ошибку, вы скорее всего испортите те файлы. Работайте в директории, недоступной снаружи, и копируйте их туда после тестирования.

    nodejs основы

    NODE.JS – программное средство для выполнения js.

    Nodejs = V8 + I/O + библиотеки

    V8: быстро, современно, экономно

    Преимущества

    • Javascript
    • Общий код на клиенте и на сервере
    • Основные задачи по web
    • Много соединений и задач одновременно
    • Легко создать рабочий прототип
    • Удобный менеджер пакетов npm
    • Сообщество

    Установка

    при установке nodejs прописывает себя в переменную PATH (+ npm), [администрирование – переменные среды]; можно проверить в командной строке:
    set PATH

    Как правило под nodejs запускают файлы: напишем простой скрипт и запустим его посредством командной строки:

    Скрипт будет выполнен и результат отобразится в командной строке.

    Документация по nodejs

    Модули nodejs

    Чтобы разобраться как работают встроенные модули nodejs необходимо скачать архив с исходниками с сайта nodejs (source code). И зайти в директорию lib . (команда dir — получаем список файлов через командную строку; Если вам необходимо перечислить файлы во всех вложенных папках, то вместо » dir » используйте » dir /s «). Если вы поставили nodejs из пакета, то в папке lib файлов не обнаружите.

    В nodejs есть модули с разной степенью стабильности. (например, 0 – не стоит использовать; 1 , 2 – использовать можно но API модуля может измениться).

    Функции растут (проект развивается) и со временем нам потребуется вынести функцию-конструктор USER в отдельный файл. Вот тут-то в дело вступают модули.

    Модули этого своего рода способ, который предлагает nodejs для организации проекта.

    Проекты как правило разрастаются, что приводит к желанию разбить проект на несколько файлов – вот тут-то в дело вступают модули.

    require

    Для html-страниц для подключения скриптов используют тег script . В nodejs существует специальная команда require .

    В нашем примере мы обращаемся к файлу ( user.js ) в той же директории (расширение ( .js ) писать необязательно).

    Первое отличие модульной системы nodejs от браузерных скриптов: если в браузере есть два тега script , то функция, которая определена на глобальном уровне одном из них доступна и в другом, а в nodejs нет. В nodejs функции и переменные являются глобальными для данного файла (они не становятся доступными при подключении посредством require ). Таким образом nodejs позволяет писать действительно независимые модули. Но чтобы модуль был доступен используется система экспортов. В каждом модуле есть специальная переменная exports .

    Модуль-директория DIR/index

    Подключаем непосредственно папку var user = require(«./user»); , в которой лежит соответствующий index.js .

    Подключаем и используем конструктор User в файле ./server.js

    « ./ » — относительно текущей папки

    exports – это объект и то, что туда положено, вернется как результат require (exports.jpg). Таким образом модуль может объявить свои приватные переменные/функции и экспортировать лишь то, что необходимо.

    Для глобальных переменных и т.д. существует объект global

    Итог

    • Подключение require
    • Переменные: var (приватные у модулей), exports , global (используется редко)
    • Виды модулей: js , node ( с расширением .node), json (с расширением .json ) . Модули json используются в том случае, когда требуется хранить какую-либо простую информацию на файле.
    • Модуль-директория DIR/index

    Объект module

    • Объект module
    • Модуль или приложение? module.parent
    • Модуль-функция module.exports = function
    • Кеширование модулей (заново модуль никогда не читается)
    • Расположение модулей: порядок поиска
    • Передаем параметры: модуль-фабрика

    Объект module (основополагающий объект для модулей) является переменной, которая существует в каждом модуле (файле, можно вывести console.log(module); ). . Содержимое: свойство id – как правило путь к файлу,
    parent – ссылка на родительский модуль ( module.parent — ссылка на родительский модуль, который require данный),
    children ( module.children — те модули, которые подключены посредством require ),
    свойство exports и другие.

    Модуль или приложение? module.parent

    Модуль может быть запущен напрямую, а если нет, если функционал подключен к другому модулю, то пусть он этот функционал экспортирует. Разделить эти два случая можно при помощи проверки:

    пс: как говорится на stackoverflow.com Родетелем является модуль, который вызвал скрипт для интерпретации

    Правильное использование module.exports

    В контексте модуля:

    module.exports = exports = this (данные конструкции равнозначны)

    exports и this ссылки на module.exports .

    Так как exports и this это всего лишь ссылки на объект, то если у них поменять значение, то они никак не повлияют на module.exports . Поэтому ранее мы использовали такой код: exports.User = User ;

    Если вы хотите передать функцию не в объекте, а напрямую, то используйте следующий синтаксис:

    Кеширование модулей

    Когда Nodejs загружает модуль он полностью создает соответствующий объект module (с учетом parent , exports и других аналогичных свойств) и запоминает его у себя ( module.id (полный путь к файлу) служит идентификатором для внутреннего кэша) и в следующий раз, когда мы повторно обращаемся (подключаем) к какому-либо модулю (файлу), nodejs берет все тот же объект из кэша. То есть, например, инициализировать модуль достаточно 1 раз в каком-либо файле, в дальнейшем его можно просто использовать.

    В нашем случае для var db = require(«../db»);
    и для var db = require(«./db»); берется один и тот же объект. Поэтому принцип следующий: в первый раз, когда используется модуль, он инициализируется и в дальнейшем мы его только подключаем и пользуемся им (то есть в нашем случае нам не нужно использовать db.connect() дважды, то есть в разных файлах).

    Расположение модулей: порядок поиска модулей в nodejs

    Как сделать так, чтобы db подключалась всегда без указания специфичного пути:

    в независимости от того в каком файле подключается db .

    Для этого нужно понимать порядок поиска модулей в nodejs (то что происходит, когда вызывается require). В nodejs существует множество встроенных модулей, например, require(«fs»); , который будет подключен без проблем. Если же в require указать конкретный путь, например, require(«../db»); , то поиск будет вестись исходя из заданного пути и файл будет найден, либо nodejs попытается получить этот файл как директорию (и будет искать index.js внутри категории).

    Если же указать require(«db»); и при этом модуль не является встроенным, то будет произведен поиск директории node_modules относительно текущего положения (если найдет, то попытается взять модуль из нее). Если директория node_modules отсутствует, то директория node_modules будет искаться выше и т.д.

    Помимо указания конкретного пути для модуля, nodejs может искать модули следующим образом:

    Введение в npm – менеджер пакетов для Node.JS

    Модуль npm идет вместе со стандартной установкой node. В этом модуле содержится консольная утилита ( npm ), которая дает доступ к громадной базе данных модулей. (https://www.npmjs.com/ ) Как правило, если стоит стандартная задача по программированию, то модуль для нее найти не составит труда. Для того чтобы поделиться модулем с другими людьми необходимо:

    1. создать файл с описанием пакета ( package.json ), который содержит информацию о модуле (имя, версия и т.д.). Либо вручную, либо через команду
      npm init
      (запросит нужную информацию)
    2. Чтобы опубликовать модуль необходимо:
      1. Добавить юзера посредством команды npm adduser (необходимо ввесть Username и Password ). Теперь вся работа с npm будет от имени этого пользователя. Юзер может залогинится на https://www.npmjs.com/

      name_user и наблюдать за своими модулями.

    3. Публикация: npm publish
  • Далее кто-либо может использовать Ваш, добавленный в базу, модуль, а сам пользователь вносить изменения.
  • Получаем все команды npm при помощи команды npm help
  • Поиск нужно модуля в базе данных: npm s ключевые_слова или npm search ключевые_слова (например, npm s super module )
  • Устанавливаем модуль: npm install name_module или npm i name_module
  • При установке модулей nodejs сначала ищет папку node_modules в текущей директории (потом выше и выше и т.д), либо (если node_modules отсутствует) ищет package.json (также поднимаясь вверх; package.json , как правило, обозначает корень проекта) и, соответственно, если находит package.json, то делает в соответствующей директории папку node_modules ; если же оба варианта не проходят, то nodejs делает папку node_modules в текущей директории. Если вы хотите поставить модуль в определенную директорию, то в этой директории необходимо создать папку node_modules .
  • npm up обновить модуль (проверит модули на обновление, которые есть в папке node_modules )
  • npm remove имя_модуля (удалить модуль)
  • Вывод по npm:

    npm init
    nmp adduser
    npm publish
    npm search ключевые слова
    npm install модуль
    npm update модуль
    npm remove модуль
    npm help команда

    Структура пакета NPM

    Установка нужной версии, например: npm i express@3.0.0

    Последнюю версию модуля можно получить в том случае, если модуль разрабатывается, используя систему версинирования git, например, на github. Достаточно получить Git Read-Only (url): https://github.com/strongloop/express.git и в консоли:

    npm i https://github.com/strongloop/express.git

    dependencies в package.json

    dependencies указывает на те модули, от которых зависит данный.

    devDependencies

    Модули прописанные в devDependencies не ставятся, если модуль подтягивается как зависимость. Они ставятся лишь для разработки и их можно установить, если, например, зайти в модуль в папке node_modules и прописать npm i (или при установке флага npm config).

    поле main задает точку входа в пакет

    Глобальные модули

    Любой модуль можно поставить глобально, если поставить флаг -g : npm -g модуль

    Топ-пост этого месяца:  Запрет на снятие наличных с анонимных карт и кошельков
    Добавить комментарий