Учебники

Node.js — Краткое руководство

Node.js — Введение

Node.js — это серверная платформа, построенная на движке Google Chrome JavaScript (V8 Engine). Node.js был разработан Райаном Далом в 2009 году, и его последняя версия v0.10.36. Определение Node.js, как указано в его официальной документации, следующее:

Node.js — это платформа, основанная на среде выполнения Chrome JavaScript, для простого создания быстрых и масштабируемых сетевых приложений. Node.js использует управляемую событиями неблокирующую модель ввода / вывода, которая делает ее легкой и эффективной, идеально подходящей для приложений с интенсивным использованием данных в реальном времени, работающих на распределенных устройствах.

Node.js — это платформа, основанная на среде выполнения Chrome JavaScript, для простого создания быстрых и масштабируемых сетевых приложений. Node.js использует управляемую событиями неблокирующую модель ввода / вывода, которая делает ее легкой и эффективной, идеально подходящей для приложений с интенсивным использованием данных в реальном времени, работающих на распределенных устройствах.

Node.js — это кроссплатформенная среда выполнения с открытым исходным кодом для разработки серверных и сетевых приложений. Приложения Node.js написаны на JavaScript и могут запускаться в среде выполнения Node.js в OS X, Microsoft Windows и Linux.

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

Node.js = Runtime Environment + JavaScript Library

Особенности Node.js

Ниже приведены некоторые важные функции, которые делают Node.js лучшим выбором для архитекторов программного обеспечения.

  • Асинхронный и управляемый событиями — все API библиотеки Node.js являются асинхронными, то есть неблокирующими. По сути, это означает, что сервер на базе Node.js никогда не ждет, пока API вернет данные. Сервер переходит к следующему API после его вызова, а механизм уведомления о событиях Node.js помогает серверу получить ответ от предыдущего вызова API.

  • Очень быстрая — библиотека Node.js, созданная на основе движка Google Chrome V8 JavaScript, очень быстро выполняет код.

  • Однопоточный, но очень масштабируемый — Node.js использует однопотоковую модель с зацикливанием событий. Механизм событий помогает серверу реагировать неблокирующим образом и обеспечивает высокую масштабируемость сервера по сравнению с традиционными серверами, которые создают ограниченные потоки для обработки запросов. Node.js использует однопотоковую программу, и та же самая программа может обслуживать гораздо большее количество запросов, чем традиционные серверы, такие как Apache HTTP Server.

  • Без буферизации — приложения Node.js никогда не буферизуют данные. Эти приложения просто выводят данные кусками.

  • Лицензия — Node.js выпущен под лицензией MIT .

Асинхронный и управляемый событиями — все API библиотеки Node.js являются асинхронными, то есть неблокирующими. По сути, это означает, что сервер на базе Node.js никогда не ждет, пока API вернет данные. Сервер переходит к следующему API после его вызова, а механизм уведомления о событиях Node.js помогает серверу получить ответ от предыдущего вызова API.

Очень быстрая — библиотека Node.js, созданная на основе движка Google Chrome V8 JavaScript, очень быстро выполняет код.

Однопоточный, но очень масштабируемый — Node.js использует однопотоковую модель с зацикливанием событий. Механизм событий помогает серверу реагировать неблокирующим образом и обеспечивает высокую масштабируемость сервера по сравнению с традиционными серверами, которые создают ограниченные потоки для обработки запросов. Node.js использует однопотоковую программу, и та же самая программа может обслуживать гораздо большее количество запросов, чем традиционные серверы, такие как Apache HTTP Server.

Без буферизации — приложения Node.js никогда не буферизуют данные. Эти приложения просто выводят данные кусками.

Лицензия — Node.js выпущен под лицензией MIT .

Кто использует Node.js?

Ниже приведена ссылка на github wiki, содержащая исчерпывающий список проектов, приложений и компаний, использующих Node.js. В этот список входят eBay, General Electric, GoDaddy, Microsoft, PayPal, Uber, Wikipins, Yahoo !, и Yammer.

Проекты, приложения и компании, использующие Node

Концепции

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

Node.js Концепции

Где использовать Node.js?

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

  • Приложения, связанные с вводом / выводом
  • Приложения для потоковой передачи данных
  • Интенсивное использование данных в реальном времени (DIRT)
  • Приложения на основе JSON API
  • Одностраничные приложения

Где не использовать Node.js?

Не рекомендуется использовать Node.js для приложений, интенсивно использующих процессор.

Node.js — Настройка среды

Попробуйте вариант онлайн

Вам действительно не нужно настраивать собственную среду, чтобы начать изучать Node.js. Причина очень проста, мы уже настроили среду Node.js онлайн, чтобы вы могли выполнить все доступные примеры в Интернете и учиться на практике. Не стесняйтесь изменять любой пример и проверять результаты с различными вариантами.

Попробуйте следующий пример, используя опцию Live Demo, доступную в верхнем правом углу нижеприведенного примера поля кода (на нашем веб-сайте) —

Live Demo

/* Hello World! program in Node.js */
console.log("Hello World!");

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

Вам действительно не нужно настраивать собственную среду, чтобы начать изучать Node.js. Причина очень проста, мы уже настроили среду Node.js онлайн, чтобы вы могли выполнить все доступные примеры в Интернете и учиться на практике. Не стесняйтесь изменять любой пример и проверять результаты с различными вариантами.

Попробуйте следующий пример, используя опцию Live Demo, доступную в верхнем правом углу нижеприведенного примера поля кода (на нашем веб-сайте) —

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

Настройка локальной среды

Если вы все еще хотите настроить свою среду для Node.js, вам потребуются следующие два программного обеспечения, доступных на вашем компьютере: (а) текстовый редактор и (б) бинарные устанавливаемые файлы Node.js.

Текстовый редактор

Это будет использоваться для ввода вашей программы. Примерами немногих редакторов являются Блокнот Windows, команда редактирования ОС, Brief, Epsilon, EMACS и vim или vi.

Имя и версия текстового редактора могут различаться в разных операционных системах. Например, Блокнот будет использоваться в Windows, а vim или vi могут использоваться в Windows, а также в Linux или UNIX.

Файлы, которые вы создаете в редакторе, называются исходными файлами и содержат исходный код программы. Исходные файлы для программ Node.js обычно называются с расширением « .js ».

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

Среда выполнения Node.js

Исходный код, написанный в исходном файле, является просто javascript. Интерпретатор Node.js будет использоваться для интерпретации и выполнения вашего кода JavaScript.

Дистрибутив Node.js поставляется в виде двоичного кода, устанавливаемого для операционных систем SunOS, Linux, Mac OS X и Windows с 32-битным (386) и 64-битным (amd64) процессорами x86.

В следующем разделе рассказывается, как установить бинарный дистрибутив Node.js на различные ОС.

Скачать архив Node.js

Загрузите последнюю версию установочного файла архива Node.js с сайта Node.js Downloads . На момент написания данного руководства ниже приведены версии, доступные для разных ОС.

Операционные системы Название архива
Windows Узел-v6.3.1-x64.msi
Linux Узел-v6.3.1-Linux-x86.tar.gz
макинтош Узел-v6.3.1-Darwin-x86.tar.gz
SunOS Узел-v6.3.1-SunOS-x86.tar.gz

Установка в UNIX / Linux / Mac OS X и SunOS

В зависимости от архитектуры вашей ОС загрузите и распакуйте архивное имя узла v6.3.1 с именем .tar.gz в / tmp, а затем, наконец, переместите извлеченные файлы в каталог / usr / local / nodejs. Например:

$ cd /tmp
$ wget http://nodejs.org/dist/v6.3.1/node-v6.3.1-linux-x64.tar.gz
$ tar xvfz node-v6.3.1-linux-x64.tar.gz
$ mkdir -p /usr/local/nodejs
$ mv node-v6.3.1-linux-x64/* /usr/local/nodejs

Добавьте / usr / local / nodejs / bin в переменную окружения PATH.

Операционные системы Выход
Linux экспорт PATH = $ PATH: / usr / local / nodejs / bin
макинтош экспорт PATH = $ PATH: / usr / local / nodejs / bin
FreeBSD экспорт PATH = $ PATH: / usr / local / nodejs / bin

Установка на Windows

Используйте файл MSI и следуйте инструкциям для установки Node.js. По умолчанию программа установки использует дистрибутив Node.js в C: \ Program Files \ nodejs. Установщик должен установить каталог C: \ Program Files \ nodejs \ bin в переменной окружения PATH окна. Перезапустите все открытые команды, чтобы изменения вступили в силу.

Проверить установку: выполнение файла

Создайте на своем компьютере файл js с именем main.js (Windows или Linux), имеющий следующий код.

Live Demo

/* Hello, World! program in node.js */
console.log("Hello, World!")

Теперь выполните файл main.js, используя интерпретатор Node.js, чтобы увидеть результат —

$ node main.js

Если с вашей установкой все в порядке, это должно привести к следующему результату —

Hello, World!

Node.js — первое приложение

Перед созданием актуального «Hello, World!» приложение, использующее Node.js, давайте посмотрим компоненты приложения Node.js. Приложение Node.js состоит из следующих трех важных компонентов:

  • Импорт обязательных модулей. Мы используем директиву require для загрузки модулей Node.js.

  • Создать сервер — сервер, который будет прослушивать запросы клиентов, аналогичные HTTP-серверу Apache.

  • Прочитать запрос и вернуть ответ . Сервер, созданный на более раннем этапе, считывает HTTP-запрос, сделанный клиентом, который может быть браузером или консолью, и возвращает ответ.

Импорт обязательных модулей. Мы используем директиву require для загрузки модулей Node.js.

Создать сервер — сервер, который будет прослушивать запросы клиентов, аналогичные HTTP-серверу Apache.

Прочитать запрос и вернуть ответ . Сервер, созданный на более раннем этапе, считывает HTTP-запрос, сделанный клиентом, который может быть браузером или консолью, и возвращает ответ.

Создание приложения Node.js

Шаг 1 — Импортировать необходимый модуль

Мы используем директиву require для загрузки модуля http и сохранения возвращенного экземпляра HTTP в переменную http следующим образом:

var http = require("http");

Шаг 2 — Создать сервер

Мы используем созданный экземпляр http и вызываем метод http.createServer () для создания экземпляра сервера, а затем привязываем его к порту 8081, используя метод listen, связанный с экземпляром сервера. Передайте ему функцию с параметрами request и response. Напишите пример реализации, чтобы всегда возвращать «Hello World».

http.createServer(function (request, response) {
   // Send the HTTP header 
   // HTTP Status: 200 : OK
   // Content Type: text/plain
   response.writeHead(200, {'Content-Type': 'text/plain'});
   
   // Send the response body as "Hello World"
   response.end('Hello World\n');
}).listen(8081);

// Console will print the message
console.log('Server running at http://127.0.0.1:8081/');

Приведенного выше кода достаточно для создания HTTP-сервера, который прослушивает, то есть ожидает запрос через порт 8081 на локальном компьютере.

Шаг 3 — Тестирование запроса и ответа

Давайте соединим шаги 1 и 2 в файле main.js и запустим наш HTTP-сервер, как показано ниже —

var http = require("http");

http.createServer(function (request, response) {
   // Send the HTTP header 
   // HTTP Status: 200 : OK
   // Content Type: text/plain
   response.writeHead(200, {'Content-Type': 'text/plain'});
   
   // Send the response body as "Hello World"
   response.end('Hello World\n');
}).listen(8081);

// Console will print the message
console.log('Server running at http://127.0.0.1:8081/');

Теперь выполните main.js, чтобы запустить сервер следующим образом:

$ node main.js

Проверьте вывод. Сервер запущен.

Server running at http://127.0.0.1:8081/

Отправить запрос на сервер Node.js

Откройте http://127.0.0.1:8081/ в любом браузере и просмотрите следующий результат.

Образец Node.js

Поздравляем, у вас запущен и работает ваш первый HTTP-сервер, который отвечает на все HTTP-запросы на порту 8081.

Node.js — REPL Terminal

REPL означает Read Eval Print Loop и представляет компьютерную среду, такую ​​как консоль Windows или оболочка Unix / Linux, где вводится команда, и система отвечает выводом в интерактивном режиме. Node.js или Node поставляется в комплекте со средой REPL. Он выполняет следующие задачи —

  • Читать — читает вводимые пользователем данные, анализирует их в структуру данных JavaScript и сохраняет в памяти.

  • Eval — принимает и оценивает структуру данных.

  • Печать — печать результата.

  • Цикл — Повторяет вышеуказанную команду, пока пользователь не нажмет ctrl-c дважды.

Читать — читает вводимые пользователем данные, анализирует их в структуру данных JavaScript и сохраняет в памяти.

Eval — принимает и оценивает структуру данных.

Печать — печать результата.

Цикл — Повторяет вышеуказанную команду, пока пользователь не нажмет ctrl-c дважды.

Функция REPL в Node очень полезна для экспериментов с кодами Node.js и для отладки JavaScript-кодов.

Терминал онлайн REPL

Чтобы упростить ваше обучение, мы создали простую в использовании среду REPL Node.js, в которой вы можете попрактиковаться в синтаксисе Node.js — Запустите Node.js REPL Terminal

Начиная REPL

REPL можно запустить, просто запустив узел в оболочке / консоли без аргументов, как указано ниже.

$ node

Вы увидите командную строку REPL>, где вы можете ввести любую команду Node.js —

$ node
>

Простое выражение

Давайте попробуем простую математику в командной строке Node.js REPL —

$ node
> 1 + 3
4
> 1 + ( 2 * 3 ) - 4
3
>

Используйте переменные

Вы можете использовать переменные для хранения значений и печати позже, как любой обычный сценарий. Если ключевое слово var не используется, то значение сохраняется в переменной и печатается. Принимая во внимание, что если используется ключевое слово var , то значение сохраняется, но не печатается. Вы можете печатать переменные используя console.log () .

$ node
> x = 10
10
> var y = 10
undefined
> x + y
20
> console.log("Hello World")
Hello World
undefined

Многострочное выражение

Узел REPL поддерживает многострочное выражение, похожее на JavaScript. Давайте проверим следующий цикл do-while в действии —

$ node
> var x = 0
undefined
> do {
   ... x++;
   ... console.log("x: " + x);
   ... } 
while ( x < 5 );
x: 1
x: 2
x: 3
x: 4
x: 5
undefined
>

приходит автоматически при нажатии Enter после открывающей скобки. Узел автоматически проверяет непрерывность выражений.

Переменная подчеркивания

Вы можете использовать подчеркивание (_), чтобы получить последний результат —

$ node
> var x = 10
undefined
> var y = 20
undefined
> x + y
30
> var sum = _
undefined
> console.log(sum)
30
undefined
>

Команды REPL

  • Ctrl + C — завершить текущую команду.

  • Ctrl + C дважды — завершить узел REPL.

  • Ctrl + D — завершить узел REPL.

  • Клавиши вверх / вниз — просмотр истории команд и изменение предыдущих команд.

  • Вкладка Keys — список текущих команд.

  • .help — список всех команд.

  • .break — выход из многострочного выражения.

  • .clear — выход из многострочного выражения.

  • .save filename — сохранить текущий сеанс REPL узла в файл.

  • .load filename — загрузить содержимое файла в текущем сеансе REPL узла.

Ctrl + C — завершить текущую команду.

Ctrl + C дважды — завершить узел REPL.

Ctrl + D — завершить узел REPL.

Клавиши вверх / вниз — просмотр истории команд и изменение предыдущих команд.

Вкладка Keys — список текущих команд.

.help — список всех команд.

.break — выход из многострочного выражения.

.clear — выход из многострочного выражения.

.save filename — сохранить текущий сеанс REPL узла в файл.

.load filename — загрузить содержимое файла в текущем сеансе REPL узла.

Остановка REPL

Как упомянуто выше, вам нужно будет дважды использовать ctrl-c, чтобы выйти из Node.js REPL.

$ node
>
(^C again to quit)
>

Node.js — NPM

Node Package Manager (NPM) предоставляет две основные функции —

  • Онлайн-репозитории для пакетов / модулей node.js, которые доступны для поиска на search.nodejs.org

  • Утилита командной строки для установки пакетов Node.js, управления версиями и управления зависимостями пакетов Node.js.

Онлайн-репозитории для пакетов / модулей node.js, которые доступны для поиска на search.nodejs.org

Утилита командной строки для установки пакетов Node.js, управления версиями и управления зависимостями пакетов Node.js.

NPM поставляется с Node.js, устанавливаемым после версии v0.6.3. Чтобы проверить то же самое, откройте консоль, введите следующую команду и посмотрите результат —

$ npm --version
2.7.1

Если вы используете старую версию NPM, то довольно легко обновить ее до последней версии. Просто используйте следующую команду от root —

$ sudo npm install npm -g
/usr/bin/npm -> /usr/lib/node_modules/npm/bin/npm-cli.js
[email protected] /usr/lib/node_modules/npm

Установка модулей с использованием NPM

Существует простой синтаксис для установки любого модуля Node.js —

$ npm install <Module Name>

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

$ npm install express

Теперь вы можете использовать этот модуль в вашем js-файле следующим образом:

var express = require('express');

Глобальная и локальная установка

По умолчанию NPM устанавливает любую зависимость в локальном режиме. Здесь локальный режим относится к установке пакета в каталоге node_modules, лежащем в папке, где находится приложение Node. Локально развернутые пакеты доступны через метод require (). Например, когда мы установили экспресс-модуль, он создал каталог node_modules в текущем каталоге, где был установлен экспресс-модуль.

$ ls -l
total 0
drwxr-xr-x 3 root root 20 Mar 17 02:23 node_modules

Кроме того, вы можете использовать команду npm ls для вывода списка всех локально установленных модулей.

Глобально установленные пакеты / зависимости хранятся в системном каталоге. Такие зависимости могут использоваться в функции CLI (интерфейс командной строки) любого node.js, но не могут быть импортированы с помощью require () в приложении Node напрямую. Теперь давайте попробуем установить экспресс-модуль с помощью глобальной установки.

$ npm install express -g

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

[email protected] /usr/lib/node_modules/express
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected]
├── [email protected] ([email protected])
├── [email protected] ([email protected])
├── [email protected] ([email protected])
├── [email protected] ([email protected], [email protected])
├── [email protected] ([email protected], [email protected], [email protected])
├── [email protected] ([email protected])
├── [email protected] ([email protected], [email protected])
└── [email protected] ([email protected], [email protected])

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

$ npm ls -g

Использование package.json

package.json присутствует в корневом каталоге любого приложения / модуля Node и используется для определения свойств пакета. Давайте откроем package.json экспресс-пакета, представленного в node_modules / express /

{
   "name": "express",
      "description": "Fast, unopinionated, minimalist web framework",
      "version": "4.11.2",
      "author": {
      
         "name": "TJ Holowaychuk",
         "email": "[email protected]"
      },
   
   "contributors": [{
      "name": "Aaron Heckmann",
      "email": "[email protected]"
   }, 
   
   {
      "name": "Ciaran Jessup",
      "email": "[email protected]"
   },
   
   {
      "name": "Douglas Christopher Wilson",
      "email": "[email protected]"
   },
   
   {
      "name": "Guillermo Rauch",
      "email": "[email protected]"
   },
   
   {
      "name": "Jonathan Ong",
      "email": "[email protected]"
   },
   
   {
      "name": "Roman Shtylman",
      "email": "[email protected]"
   },
   
   {
      "name": "Young Jae Sim",
      "email": "[email protected]"
   } ],
   
   "license": "MIT", "repository": {
      "type": "git",
      "url": "https://github.com/strongloop/express"
   },
   
   "homepage": "https://expressjs.com/", "keywords": [
      "express",
      "framework",
      "sinatra",
      "web",
      "rest",
      "restful",
      "router",
      "app",
      "api"
   ],
   
   "dependencies": {
      "accepts": "~1.2.3",
      "content-disposition": "0.5.0",
      "cookie-signature": "1.0.5",
      "debug": "~2.1.1",
      "depd": "~1.0.0",
      "escape-html": "1.0.1",
      "etag": "~1.5.1",
      "finalhandler": "0.3.3",
      "fresh": "0.2.4",
      "media-typer": "0.3.0",
      "methods": "~1.1.1",
      "on-finished": "~2.2.0",
      "parseurl": "~1.3.0",
      "path-to-regexp": "0.1.3",
      "proxy-addr": "~1.0.6",
      "qs": "2.3.3",
      "range-parser": "~1.0.2",
      "send": "0.11.1",
      "serve-static": "~1.8.1",
      "type-is": "~1.5.6",
      "vary": "~1.0.0",
      "cookie": "0.1.2",
      "merge-descriptors": "0.0.2",
      "utils-merge": "1.0.0"
   },
   
   "devDependencies": {
      "after": "0.8.1",
      "ejs": "2.1.4",
      "istanbul": "0.3.5",
      "marked": "0.3.3",
      "mocha": "~2.1.0",
      "should": "~4.6.2",
      "supertest": "~0.15.0",
      "hjs": "~0.0.6",
      "body-parser": "~1.11.0",
      "connect-redis": "~2.2.0",
      "cookie-parser": "~1.3.3",
      "express-session": "~1.10.2",
      "jade": "~1.9.1",
      "method-override": "~2.3.1",
      "morgan": "~1.5.1",
      "multiparty": "~4.1.1",
      "vhost": "~3.0.0"
   },
   
   "engines": {
      "node": ">= 0.10.0"
   },
   
   "files": [
      "LICENSE",
      "History.md",
      "Readme.md",
      "index.js",
      "lib/"
   ],
   
   "scripts": {
      "test": "mocha --require test/support/env 
         --reporter spec --bail --check-leaks test/ test/acceptance/",
      "test-cov": "istanbul cover node_modules/mocha/bin/_mocha 
         -- --require test/support/env --reporter dot --check-leaks test/ test/acceptance/",
      "test-tap": "mocha --require test/support/env 
         --reporter tap --check-leaks test/ test/acceptance/",
      "test-travis": "istanbul cover node_modules/mocha/bin/_mocha 
         --report lcovonly -- --require test/support/env 
         --reporter spec --check-leaks test/ test/acceptance/"
   },
   
   "gitHead": "63ab25579bda70b4927a179b580a9c580b6c7ada",
   "bugs": {
      "url": "https://github.com/strongloop/express/issues"
   },
   
   "_id": "[email protected]",
   "_shasum": "8df3d5a9ac848585f00a0777601823faecd3b148",
   "_from": "express@*",
   "_npmVersion": "1.4.28",
   "_npmUser": {
      "name": "dougwilson",
      "email": "[email protected]"
   },
   
   "maintainers": [{
      "name": "tjholowaychuk",
      "email": "[email protected]"
   },
   
   {
      "name": "jongleberry",
      "email": "[email protected]"
   },
   
   {
      "name": "shtylman",
      "email": "[email protected]"
   },
   
   {
      "name": "dougwilson",
      "email": "[email protected]"
   },
   
   {
      "name": "aredridel",
      "email": "[email protected]"
   },
   
   {
      "name": "strongloop",
      "email": "[email protected]"
   },
   
   {
      "name": "rfeng",
      "email": "[email protected]"
   }],
   
   "dist": {
      "shasum": "8df3d5a9ac848585f00a0777601823faecd3b148",
      "tarball": "https://registry.npmjs.org/express/-/express-4.11.2.tgz"
   },
   
   "directories": {},
      "_resolved": "https://registry.npmjs.org/express/-/express-4.11.2.tgz",
      "readme": "ERROR: No README data found!"
}

Атрибуты Package.json

  • name — название посылки

  • версия — версия пакета

  • описание — описание пакета

  • домашняя страница — домашняя страница пакета

  • автор — автор пакета

  • contributors — имя автора пакета

  • зависимости — список зависимостей. NPM автоматически устанавливает все зависимости, упомянутые здесь, в папке node_module пакета.

  • репозиторий — тип репозитория и URL пакета

  • main — точка входа пакета

  • ключевые слова — ключевые слова

name — название посылки

версия — версия пакета

описание — описание пакета

домашняя страница — домашняя страница пакета

автор — автор пакета

contributors — имя автора пакета

зависимости — список зависимостей. NPM автоматически устанавливает все зависимости, упомянутые здесь, в папке node_module пакета.

репозиторий — тип репозитория и URL пакета

main — точка входа пакета

ключевые слова — ключевые слова

Удаление модуля

Используйте следующую команду, чтобы удалить модуль Node.js.

$ npm uninstall express

Как только NPM удалит пакет, вы можете проверить его, посмотрев содержимое каталога / node_modules / или набрав следующую команду:

$ npm ls

Обновление модуля

Обновите файл package.json, измените версию обновляемой зависимости и выполните следующую команду.

$ npm update express

Поиск модуля

Поиск имени пакета с помощью NPM.

$ npm search express

Создать модуль

Создание модуля требует, чтобы был создан package.json. Давайте сгенерируем package.json, используя NPM, который сгенерирует базовый скелет package.json.

$ npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sane defaults.

See 'npm help json' for definitive documentation on these fields
and exactly what they do.

Use 'npm install <pkg> --save' afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
name: (webmaster)

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

$ npm adduser
Username: mcmohd
Password:
Email: (this IS public) [email protected]

Настало время опубликовать ваш модуль —

$ npm publish

Если с вашим модулем все в порядке, он будет опубликован в репозитории и будет доступен для установки с использованием NPM, как и любой другой модуль Node.js.

Node.js — концепция обратных вызовов

Что такое обратный звонок?

Обратный вызов является асинхронным эквивалентом для функции. Функция обратного вызова вызывается при завершении данной задачи. Узел интенсивно использует обратные вызовы. Все API-интерфейсы Node написаны таким образом, что они поддерживают обратные вызовы.

Например, функция для чтения файла может начать чтение файла и немедленно вернуть управление в среду выполнения, чтобы можно было выполнить следующую инструкцию. Как только файловый ввод / вывод будет завершен, он вызовет функцию обратного вызова при передаче функции обратного вызова, содержимое файла в качестве параметра. Таким образом, нет блокировки или ожидания файлового ввода-вывода. Это делает Node.js легко масштабируемым, так как он может обрабатывать большое количество запросов, не ожидая, пока какая-либо функция вернет результаты.

Пример кода блокировки

Создайте текстовый файл с именем input.txt со следующим содержанием —

Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Создайте js-файл с именем main.js со следующим кодом —

var fs = require("fs");
var data = fs.readFileSync('input.txt');

console.log(data.toString());
console.log("Program Ended");

Теперь запустите main.js, чтобы увидеть результат —

$ node main.js

Проверьте вывод.

Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!
Program Ended

Пример неблокирующего кода

Создайте текстовый файл с именем input.txt со следующим содержанием.

Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Обновите main.js, чтобы иметь следующий код —

var fs = require("fs");

fs.readFile('input.txt', function (err, data) {
   if (err) return console.error(err);
   console.log(data.toString());
});

console.log("Program Ended");

Теперь запустите main.js, чтобы увидеть результат —

$ node main.js

Проверьте вывод.

Program Ended
Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Эти два примера объясняют концепцию блокирующих и неблокирующих вызовов.

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

  • Второй пример показывает, что программа не ждет чтения файла и продолжает печатать «Программа завершена», и в то же время программа без блокировки продолжает чтение файла.

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

Второй пример показывает, что программа не ждет чтения файла и продолжает печатать «Программа завершена», и в то же время программа без блокировки продолжает чтение файла.

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

Node.js — цикл событий

Node.js — это однопоточное приложение, но оно может поддерживать параллелизм посредством концепции событий и обратных вызовов . Каждый API Node.js является асинхронным и однопоточным, они используют вызовы асинхронных функций для обеспечения параллелизма. Узел использует шаблон наблюдателя. Поток узла хранит цикл событий и всякий раз, когда задача завершается, запускает соответствующее событие, которое сигнализирует о выполнении функции прослушивателя событий.

Событийное программирование

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

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

Цикл событий

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

// Import events module
var events = require('events');

// Create an eventEmitter object
var eventEmitter = new events.EventEmitter();

Ниже приведен синтаксис для привязки обработчика события к событию:

// Bind event and event  handler as follows
eventEmitter.on('eventName', eventHandler);

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

// Fire an event 
eventEmitter.emit('eventName');

пример

Создайте js-файл с именем main.js со следующим кодом —

Live Demo

// Import events module
var events = require('events');

// Create an eventEmitter object
var eventEmitter = new events.EventEmitter();

// Create an event handler as follows
var connectHandler = function connected() {
   console.log('connection succesful.');
  
   // Fire the data_received event 
   eventEmitter.emit('data_received');
}

// Bind the connection event with the handler
eventEmitter.on('connection', connectHandler);
 
// Bind the data_received event with the anonymous function
eventEmitter.on('data_received', function() {
   console.log('data received succesfully.');
});

// Fire the connection event 
eventEmitter.emit('connection');

console.log("Program Ended.");

Теперь давайте попробуем запустить вышеуказанную программу и проверить ее вывод:

$ node main.js

ЭТО должно дать следующий результат —

connection successful.
data received successfully.
Program Ended.

Как работают Node-приложения?

В Node Application любая асинхронная функция принимает обратный вызов в качестве последнего параметра, а функция обратного вызова принимает ошибку в качестве первого параметра. Давайте снова вернемся к предыдущему примеру. Создайте текстовый файл с именем input.txt со следующим содержанием.

Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Создайте js-файл с именем main.js, имеющий следующий код —

var fs = require("fs");

fs.readFile('input.txt', function (err, data) {
   if (err) {
      console.log(err.stack);
      return;
   }
   console.log(data.toString());
});
console.log("Program Ended");

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

Program Ended
Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Node.js — Event Emitter

Многие объекты в узле генерируют события, например, net.Server генерирует событие каждый раз, когда к нему подключается одноранговый узел, а fs.readStream генерирует событие при открытии файла. Все объекты, которые генерируют события, являются экземплярами events.EventEmitter.

Класс EventEmitter

Как мы видели в предыдущем разделе, класс EventEmitter находится в модуле событий. Это доступно через следующий код —

// Import events module
var events = require('events');

// Create an eventEmitter object
var eventEmitter = new events.EventEmitter();

Когда экземпляр EventEmitter сталкивается с какой-либо ошибкой, он генерирует событие error. Когда добавляется новый слушатель, вызывается событие «newListener», а когда слушатель удаляется, вызывается событие «removeListener».

EventEmitter предоставляет несколько свойств, таких как on и emit . Свойство on используется для связывания функции с событием, а emit — для запуска события.

методы

Sr.No. Метод и описание
1

addListener (событие, слушатель)

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

2

на (событие, слушатель)

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

3

один раз (событие, слушатель)

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

4

removeListener (событие, слушатель)

Удаляет слушателя из массива слушателей для указанного события. Осторожно — изменяет индексы массива в массиве слушателя за слушателем. removeListener удалит не более одного экземпляра слушателя из массива слушателей. Если какой-либо один прослушиватель был добавлен несколько раз в массив слушателей для указанного события, то для удаления каждого экземпляра необходимо вызывать removeListener несколько раз. Возвращает эмиттер, поэтому звонки могут быть связаны.

5

removeAllListeners ([событие])

Удаляет всех слушателей или участников указанного события. Не стоит удалять прослушиватели, которые были добавлены где-то еще в коде, особенно когда он находится на эмиттере, который вы не создали (например, сокеты или потоки файлов). Возвращает эмиттер, поэтому звонки могут быть связаны.

6

setMaxListeners (п)

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

7

слушатели (событие)

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

8

emit (событие, [arg1], [arg2], […])

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

addListener (событие, слушатель)

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

на (событие, слушатель)

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

один раз (событие, слушатель)

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

removeListener (событие, слушатель)

Удаляет слушателя из массива слушателей для указанного события. Осторожно — изменяет индексы массива в массиве слушателя за слушателем. removeListener удалит не более одного экземпляра слушателя из массива слушателей. Если какой-либо один прослушиватель был добавлен несколько раз в массив слушателей для указанного события, то для удаления каждого экземпляра необходимо вызывать removeListener несколько раз. Возвращает эмиттер, поэтому звонки могут быть связаны.

removeAllListeners ([событие])

Удаляет всех слушателей или участников указанного события. Не стоит удалять прослушиватели, которые были добавлены где-то еще в коде, особенно когда он находится на эмиттере, который вы не создали (например, сокеты или потоки файлов). Возвращает эмиттер, поэтому звонки могут быть связаны.

setMaxListeners (п)

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

слушатели (событие)

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

emit (событие, [arg1], [arg2], […])

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

Методы класса

Sr.No. Метод и описание
1

listenerCount (эмитент, событие)

Возвращает количество слушателей для данного события.

listenerCount (эмитент, событие)

Возвращает количество слушателей для данного события.

События

Sr.No. События и описание
1

NewListener

  • event — String: название события

  • слушатель — Функция: функция обработчика события

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

2

удаления слушателя

  • event — String Имя события

  • listener — Function Функция обработчика событий

Это событие генерируется каждый раз, когда кто-то удаляет слушателя. Когда это событие инициировано, слушатель, возможно, еще не был удален из массива слушателей для события.

NewListener

event — String: название события

слушатель — Функция: функция обработчика события

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

удаления слушателя

event — String Имя события

listener — Function Функция обработчика событий

Это событие генерируется каждый раз, когда кто-то удаляет слушателя. Когда это событие инициировано, слушатель, возможно, еще не был удален из массива слушателей для события.

пример

Создайте файл js с именем main.js со следующим кодом Node.js:

Live Demo

var events = require('events');
var eventEmitter = new events.EventEmitter();

// listener #1
var listner1 = function listner1() {
   console.log('listner1 executed.');
}

// listener #2
var listner2 = function listner2() {
   console.log('listner2 executed.');
}

// Bind the connection event with the listner1 function
eventEmitter.addListener('connection', listner1);

// Bind the connection event with the listner2 function
eventEmitter.on('connection', listner2);

var eventListeners = require('events').EventEmitter.listenerCount
   (eventEmitter,'connection');
console.log(eventListeners + " Listner(s) listening to connection event");

// Fire the connection event 
eventEmitter.emit('connection');

// Remove the binding of listner1 function
eventEmitter.removeListener('connection', listner1);
console.log("Listner1 will not listen now.");

// Fire the connection event 
eventEmitter.emit('connection');

eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
console.log(eventListeners + " Listner(s) listening to connection event");

console.log("Program Ended.");

Теперь запустите main.js, чтобы увидеть результат —

$ node main.js

Проверьте вывод.

2 Listner(s) listening to connection event
listner1 executed.
listner2 executed.
Listner1 will not listen now.
listner2 executed.
1 Listner(s) listening to connection event
Program Ended.

Node.js — Буферы

Чистый JavaScript удобен для Unicode, но не для двоичных данных. При работе с потоками TCP или файловой системой необходимо обрабатывать потоки октетов. Узел предоставляет класс Buffer, который предоставляет экземпляры для хранения необработанных данных, аналогичных массиву целых чисел, но соответствует необработанному выделению памяти вне кучи V8.

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

Создание буферов

Node Buffer может быть создан различными способами.

Способ 1

Ниже приведен синтаксис для создания непосвященного буфера из 10 октетов:

var buf = new Buffer(10);

Способ 2

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

var buf = new Buffer([10, 20, 30, 40, 50]);

Способ 3

Ниже приведен синтаксис для создания буфера из заданной строки и, необязательно, типа кодирования:

var buf = new Buffer("Simply Easy Learning", "utf-8");

Хотя «utf8» является кодировкой по умолчанию, вы можете использовать любую из следующих кодировок «ascii», «utf8», «utf16le», «ucs2», «base64» или «hex».

Запись в буферы

Синтаксис

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

buf.write(string[, offset][, length][, encoding])

параметры

Вот описание используемых параметров —

  • строка — это строковые данные, которые будут записаны в буфер.

  • смещение — это индекс буфера, с которого начинается запись. Значение по умолчанию 0.

  • длина — это число байтов для записи. По умолчанию используется значение buffer.length.

  • кодировка — кодировка для использования. utf8 — кодировка по умолчанию.

строка — это строковые данные, которые будут записаны в буфер.

смещение — это индекс буфера, с которого начинается запись. Значение по умолчанию 0.

длина — это число байтов для записи. По умолчанию используется значение buffer.length.

кодировка — кодировка для использования. utf8 — кодировка по умолчанию.

Возвращаемое значение

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

пример

Live Demo

buf = new Buffer(256);
len = buf.write("Simply Easy Learning");

console.log("Octets written : "+  len);

Когда вышеуказанная программа выполняется, она дает следующий результат —

Octets written : 20

Чтение из буфера

Синтаксис

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

buf.toString([encoding][, start][, end])

параметры

Вот описание используемых параметров —

  • кодировка — кодировка для использования. utf8 — кодировка по умолчанию.

  • start — Начальный индекс для начала чтения, по умолчанию 0.

  • end — конец индекса до конца чтения, по умолчанию это полный буфер.

кодировка — кодировка для использования. utf8 — кодировка по умолчанию.

start — Начальный индекс для начала чтения, по умолчанию 0.

end — конец индекса до конца чтения, по умолчанию это полный буфер.

Возвращаемое значение

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

пример

Live Demo

buf = new Buffer(26);
for (var i = 0 ; i < 26 ; i++) {
  buf[i] = i + 97;
}

console.log( buf.toString('ascii'));       // outputs: abcdefghijklmnopqrstuvwxyz
console.log( buf.toString('ascii',0,5));   // outputs: abcde
console.log( buf.toString('utf8',0,5));    // outputs: abcde
console.log( buf.toString(undefined,0,5)); // encoding defaults to 'utf8', outputs abcde

Когда вышеуказанная программа выполняется, она дает следующий результат —

abcdefghijklmnopqrstuvwxyz
abcde
abcde
abcde

Конвертировать буфер в JSON

Синтаксис

Ниже приведен синтаксис метода для преобразования Node Buffer в объект JSON:

buf.toJSON()

Возвращаемое значение

Этот метод возвращает JSON-представление экземпляра Buffer.

пример

Live Demo

var buf = new Buffer('Simply Easy Learning');
var json = buf.toJSON(buf);

console.log(json);

Когда вышеуказанная программа выполняется, она дает следующий результат —

{ type: 'Buffer',
   data: 
   [ 
      83,
      105,
      109,
      112,
      108,
      121,
      32,
      69,
      97,
      115,
      121,
      32,
      76,
      101,
      97,
      114,
      110,
      105,
      110,
      103 
   ]
}

Объединенные буферы

Синтаксис

Ниже приведен синтаксис метода для объединения буферов узла в один буфер узла.

Buffer.concat(list[, totalLength])

параметры

Вот описание используемых параметров —

  • list — Array Список объектов Buffer, которые будут объединены.

  • totalLength — это общая длина буферов при объединении.

list — Array Список объектов Buffer, которые будут объединены.

totalLength — это общая длина буферов при объединении.

Возвращаемое значение

Этот метод возвращает экземпляр Buffer.

пример

Live Demo

var buffer1 = new Buffer('TutorialsPoint ');
var buffer2 = new Buffer('Simply Easy Learning');
var buffer3 = Buffer.concat([buffer1,buffer2]);

console.log("buffer3 content: " + buffer3.toString());

Когда вышеуказанная программа выполняется, она дает следующий результат —

buffer3 content: TutorialsPoint Simply Easy Learning

Сравнить буферы

Синтаксис

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

buf.compare(otherBuffer);

параметры

Вот описание используемых параметров —

  • otherBuffer — это другой буфер, который будет сравниваться с buf

otherBuffer — это другой буфер, который будет сравниваться с buf

Возвращаемое значение

Возвращает число, указывающее, идет ли оно до или после или совпадает с otherBuffer в порядке сортировки.

пример

Live Demo

var buffer1 = new Buffer('ABC');
var buffer2 = new Buffer('ABCD');
var result = buffer1.compare(buffer2);

if(result < 0) {
   console.log(buffer1 +" comes before " + buffer2);
} else if(result === 0) {
   console.log(buffer1 +" is same as " + buffer2);
} else {
   console.log(buffer1 +" comes after " + buffer2);
}

Когда вышеуказанная программа выполняется, она дает следующий результат —

ABC comes before ABCD

Копировать буфер

Синтаксис

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

buf.copy(targetBuffer[, targetStart][, sourceStart][, sourceEnd])

параметры

Вот описание используемых параметров —

  • targetBuffer — объект буфера, куда будет скопирован буфер.

  • targetStart — Число, Необязательно, По умолчанию: 0

  • sourceStart — Число, Необязательно, По умолчанию: 0

  • sourceEnd — Номер, Необязательно, По умолчанию: buffer.length

targetBuffer — объект буфера, куда будет скопирован буфер.

targetStart — Число, Необязательно, По умолчанию: 0

sourceStart — Число, Необязательно, По умолчанию: 0

sourceEnd — Номер, Необязательно, По умолчанию: buffer.length

Возвращаемое значение

Нет возвращаемого значения. Копирует данные из области этого буфера в область в целевом буфере, даже если целевая область памяти перекрывается с источником. Если значение не определено, для параметров targetStart и sourceStart по умолчанию задано значение 0, а для sourceEnd по умолчанию установлено значение buffer.length.

пример

Live Demo

var buffer1 = new Buffer('ABC');

//copy a buffer
var buffer2 = new Buffer(3);
buffer1.copy(buffer2);
console.log("buffer2 content: " + buffer2.toString());

Когда вышеуказанная программа выполняется, она дает следующий результат —

buffer2 content: ABC

Slice Buffer

Синтаксис

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

buf.slice([start][, end])

параметры

Вот описание используемых параметров —

  • начало — число, опционально, по умолчанию: 0

  • end — Число, Необязательно, По умолчанию: buffer.length

начало — число, опционально, по умолчанию: 0

end — Число, Необязательно, По умолчанию: buffer.length

Возвращаемое значение

Возвращает новый буфер, который ссылается на ту же память, что и старый, но смещен и обрезан по начальному (по умолчанию 0) и конечному (по умолчанию buffer.length) индексам. Отрицательные индексы начинаются с конца буфера.

пример

Live Demo

var buffer1 = new Buffer('TutorialsPoint');

//slicing a buffer
var buffer2 = buffer1.slice(0,9);
console.log("buffer2 content: " + buffer2.toString());

Когда вышеуказанная программа выполняется, она дает следующий результат —

buffer2 content: Tutorials

Длина буфера

Синтаксис

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

buf.length;

Возвращаемое значение

Возвращает размер буфера в байтах.

пример

Live Demo

var buffer = new Buffer('TutorialsPoint');

//length of the buffer
console.log("buffer length: " + buffer.length);

Когда вышеуказанная программа выполняется, она дает следующий результат —

buffer length: 14

Справочник по методам

новый буфер (размер)

Выделяет новый буфер размером октетов. Обратите внимание, что размер должен быть не более kMaxLength. В противном случае здесь будет брошена RangeError.

новый буфер (буфер)

Копирует переданные данные буфера в новый экземпляр Buffer.

новый буфер (str [, кодировка])

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

buf.length

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

buf.write (строка [, смещение] [, длина] [, кодировка])

Записывает строку в буфер со смещением, используя заданную кодировку. смещение по умолчанию равно 0, кодирование по умолчанию — utf8. длина — это количество байтов для записи. Возвращает количество записанных октетов.

buf.writeUIntLE (значение, смещение, byteLength [, noAssert])

Записывает значение в буфер с указанным смещением и byteLength. Поддерживает до 48 бит точности. Установите для noAssert значение true, чтобы пропустить проверку значения и смещения. По умолчанию false.

buf.writeUIntBE (значение, смещение, byteLength [, noAssert])

Записывает значение в буфер с указанным смещением и byteLength. Поддерживает до 48 бит точности. Установите для noAssert значение true, чтобы пропустить проверку значения и смещения. По умолчанию false.

buf.writeIntLE (значение, смещение, byteLength [, noAssert])

Записывает значение в буфер с указанным смещением и byteLength. Поддерживает до 48 бит точности. Установите для noAssert значение true, чтобы пропустить проверку значения и смещения. По умолчанию false.

buf.writeIntBE (значение, смещение, byteLength [, noAssert])

Записывает значение в буфер с указанным смещением и byteLength. Поддерживает до 48 бит точности. Установите для noAssert значение true, чтобы пропустить проверку значения и смещения. По умолчанию false.

buf.readUIntLE (offset, byteLength [, noAssert])

Обобщенная версия всех числовых методов чтения. Поддерживает до 48 бит точности. Установите для noAssert значение true, чтобы пропустить проверку смещения. Это означает, что смещение может быть за пределами буфера. По умолчанию false.

buf.readUIntBE (offset, byteLength [, noAssert])

Обобщенная версия всех числовых методов чтения. Поддерживает до 48 бит точности. Установите для noAssert значение true, чтобы пропустить проверку смещения. Это означает, что смещение может быть за пределами буфера. По умолчанию false.

buf.readIntLE (offset, byteLength [, noAssert])

Обобщенная версия всех числовых методов чтения. Поддерживает до 48 бит точности. Установите для noAssert значение true, чтобы пропустить проверку смещения. Это означает, что смещение может быть за пределами буфера. По умолчанию false.

buf.readIntBE (offset, byteLength [, noAssert])

Обобщенная версия всех числовых методов чтения. Поддерживает до 48 бит точности. Установите для noAssert значение true, чтобы пропустить проверку смещения. Это означает, что смещение может быть за пределами буфера. По умолчанию false.

buf.toString ([кодировка] [, начало] [, конец])

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

buf.toJSON ()

Возвращает JSON-представление экземпляра Buffer. JSON.stringify неявно вызывает эту функцию при строковом преобразовании экземпляра Buffer.

ЬиЕ [индекс]

Получить и установить октет по индексу. Значения относятся к отдельным байтам, поэтому допустимый диапазон составляет от 0x00 до 0xFF hex или от 0 до 255.

buf.equals (otherBuffer)

Возвращает логическое значение, если этот буфер и otherBuffer имеют одинаковые байты.

buf.compare (otherBuffer)

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

buf.copy (targetBuffer [, targetStart] [, sourceStart] [, sourceEnd])

Копирует данные из области этого буфера в область в целевом буфере, даже если целевая область памяти перекрывается с источником. Если значение не определено, для параметров targetStart и sourceStart по умолчанию задано значение 0, а для sourceEnd по умолчанию установлено значение buffer.length.

buf.slice ([начало] [, конец])

Возвращает новый буфер, который ссылается на ту же память, что и старый, но смещен и обрезан по начальному (по умолчанию 0) и конечному (по умолчанию buffer.length) индексам. Отрицательные индексы начинаются с конца буфера.

buf.readUInt8 (offset [, noAssert])

Читает 8-разрядное целое число без знака из буфера с указанным смещением. Установите для noAssert значение true, чтобы пропустить проверку смещения. Это означает, что смещение может быть за пределами буфера. По умолчанию false.

buf.readUInt16LE (offset [, noAssert])

Читает 16-разрядное целое число без знака из буфера с заданным смещением в указанном формате с прямым порядком байтов. Установите для noAssert значение true, чтобы пропустить проверку смещения. Это означает, что смещение может быть за пределами буфера. По умолчанию false.

buf.readUInt16BE (offset [, noAssert])

Читает 16-разрядное целое число без знака из буфера с заданным смещением в указанном формате с прямым порядком байтов. Установите для noAssert значение true, чтобы пропустить проверку смещения. Это означает, что смещение может быть за пределами буфера. По умолчанию false.

buf.readUInt32LE (offset [, noAssert])

Считывает из буфера 32-разрядное целое число без знака с заданным смещением в указанном формате. Установите для noAssert значение true, чтобы пропустить проверку смещения. Это означает, что смещение может быть за пределами буфера. По умолчанию false.

buf.readUInt32BE (offset [, noAssert])

Считывает из буфера 32-разрядное целое число без знака с заданным смещением в указанном формате. Установите для noAssert значение true, чтобы пропустить проверку смещения. Это означает, что смещение может быть за пределами буфера. По умолчанию false.

buf.readInt8 (offset [, noAssert])

Читает 8-разрядное целое число со знаком из буфера с указанным смещением. Установите для noAssert значение true, чтобы пропустить проверку смещения. Это означает, что смещение может быть за пределами буфера. По умолчанию false.

buf.readInt16LE (offset [, noAssert])

Считывает из буфера 16-разрядное целое число со знаком с указанным смещением в указанном формате. Установите для noAssert значение true, чтобы пропустить проверку смещения. Это означает, что смещение может быть за пределами буфера. По умолчанию false.

buf.readInt16BE (offset [, noAssert])

Считывает из буфера 16-разрядное целое число со знаком с указанным смещением в указанном формате. Установите для noAssert значение true, чтобы пропустить проверку смещения. Это означает, что смещение может быть за пределами буфера. По умолчанию false.

buf.readInt32LE (offset [, noAssert])

Считывает из буфера 32-разрядное целое число со знаком с указанным смещением в указанном формате с прямым порядком байтов. Установите для noAssert значение true, чтобы пропустить проверку смещения. Это означает, что смещение может быть за пределами буфера. По умолчанию false.

buf.readInt32BE (offset [, noAssert])

Считывает из буфера 32-разрядное целое число со знаком с указанным смещением в указанном формате с прямым порядком байтов. Установите для noAssert значение true, чтобы пропустить проверку смещения. Это означает, что смещение может быть за пределами буфера. По умолчанию false.

buf.readFloatLE (offset [, noAssert])

Считывает 32-разрядное значение с плавающей точкой из буфера с указанным смещением в указанном формате с прямым порядком байтов. Установите для noAssert значение true, чтобы пропустить проверку смещения. Это означает, что смещение может быть за пределами буфера. По умолчанию false.

buf.readFloatBE (offset [, noAssert])

Считывает 32-разрядное значение с плавающей точкой из буфера с указанным смещением в указанном формате с прямым порядком байтов. Установите для noAssert значение true, чтобы пропустить проверку смещения. Это означает, что смещение может быть за пределами буфера. По умолчанию false.

buf.readDoubleLE (offset [, noAssert])

Считывает 64-битный дубль из буфера с указанным смещением в указанном формате с прямым порядком байтов. Установите для noAssert значение true, чтобы пропустить проверку смещения. Это означает, что смещение может быть за пределами буфера. По умолчанию false.

buf.readDoubleBE (offset [, noAssert])

Считывает 64-битный дубль из буфера с указанным смещением в указанном формате с прямым порядком байтов. Установите для noAssert значение true, чтобы пропустить проверку смещения. Это означает, что смещение может быть за пределами буфера. По умолчанию false.

buf.writeUInt8 (значение, смещение [, noAssert])

Записывает значение в буфер с указанным смещением. Обратите внимание, что значение должно быть действительным 8-разрядным целым числом без знака. Установите для noAssert значение true, чтобы пропустить проверку значения и смещения. Это означает, что значение может быть слишком большим для конкретной функции, а смещение может выходить за пределы буфера, что приводит к тому, что значения отбрасываются без вывода сообщений. Он не должен использоваться, если вы не уверены в его правильности. По умолчанию false.

buf.writeUInt16LE (значение, смещение [, noAssert])

Записывает значение в буфер с указанным смещением в указанном формате с прямым порядком байтов. Обратите внимание, что значение должно быть действительным 16-разрядным целым числом без знака. Установите для noAssert значение true, чтобы пропустить проверку значения и смещения. Это означает, что значение может быть слишком большим для конкретной функции, а смещение может быть за пределами конца буфера, что приводит к незаметному удалению значений. Это не должно использоваться, если вы не уверены в правильности. По умолчанию false.

buf.writeUInt16BE (значение, смещение [, noAssert])

Записывает значение в буфер с указанным смещением в указанном формате с прямым порядком байтов. Обратите внимание, что значение должно быть действительным 16-разрядным целым числом без знака. Установите для noAssert значение true, чтобы пропустить проверку значения и смещения. Это означает, что значение может быть слишком большим для конкретной функции, а смещение может быть за пределами конца буфера, что приводит к незаметному удалению значений. Он не должен использоваться, если вы не уверены в его правильности. По умолчанию false.

buf.writeUInt32LE (значение, смещение [, noAssert])

Записывает значение в буфер с указанным смещением в указанном формате с прямым порядком байтов. Обратите внимание, что значение должно быть действительным 32-разрядным целым числом без знака. Установите для noAssert значение true, чтобы пропустить проверку значения и смещения. Это означает, что значение может быть слишком большим для конкретной функции, а смещение может быть за пределами конца буфера, что приводит к незаметному удалению значений. Он не должен использоваться, если вы не уверены в его правильности. По умолчанию false.

buf.writeUInt32BE (значение, смещение [, noAssert])

Записывает значение в буфер с указанным смещением в указанном формате с прямым порядком байтов. Обратите внимание, что значение должно быть действительным 32-разрядным целым числом без знака. Установите для noAssert значение true, чтобы пропустить проверку значения и смещения. Это означает, что значение может быть слишком большим для конкретной функции, а смещение может быть за пределами конца буфера, что приводит к незаметному удалению значений. Он не должен использоваться, если вы не уверены в его правильности. По умолчанию false.

buf.writeInt8 (значение, смещение [, noAssert])

Записывает значение в буфер с указанным смещением в указанном формате с прямым порядком байтов. Обратите внимание, что значение должно быть действительным 8-разрядным целым числом со знаком. Установите для noAssert значение true, чтобы пропустить проверку значения и смещения. Это означает, что значение может быть слишком большим для конкретной функции, а смещение может быть за пределами конца буфера, что приводит к незаметному удалению значений. Он не должен использоваться, если вы не уверены в его правильности. По умолчанию false.

buf.writeInt16LE (значение, смещение [, noAssert])

Записывает значение в буфер с указанным смещением в указанном формате с прямым порядком байтов. Обратите внимание, что значение должно быть действительным знаковым 16-разрядным целым числом. Установите для noAssert значение true, чтобы пропустить проверку значения и смещения. Это означает, что значение может быть слишком большим для конкретной функции, а смещение может быть за пределами конца буфера, что приводит к незаметному удалению значений. Он не должен использоваться, если вы не уверены в его правильности. По умолчанию false.

buf.writeInt16BE (значение, смещение [, noAssert])

Записывает значение в буфер с указанным смещением в указанном формате с прямым порядком байтов. Обратите внимание, что значение должно быть действительным знаковым 16-разрядным целым числом. Установите для noAssert значение true, чтобы пропустить проверку значения и смещения. Это означает, что значение может быть слишком большим для конкретной функции, а смещение может выходить за пределы буфера, что приводит к тому, что значения отбрасываются без вывода сообщений. Он не должен использоваться, если вы не уверены в его правильности. По умолчанию false.

buf.writeInt32LE (значение, смещение [, noAssert])

Записывает значение в буфер с указанным смещением в указанном формате с прямым порядком байтов. Обратите внимание, что значение должно быть действительным знаковым 32-разрядным целым числом. Установите для noAssert значение true, чтобы пропустить проверку значения и смещения. Это означает, что значение может быть слишком большим для конкретной функции, а смещение может быть за пределами конца буфера, что приводит к незаметному удалению значений. Он не должен использоваться, если вы не уверены в его правильности. По умолчанию false.

buf.writeInt32BE (значение, смещение [, noAssert])

Записывает значение в буфер с указанным смещением в указанном формате с прямым порядком байтов. Обратите внимание, что значение должно быть действительным знаковым 32-разрядным целым числом. Установите для noAssert значение true, чтобы пропустить проверку значения и смещения. Это означает, что значение может быть слишком большим для конкретной функции, а смещение может быть за пределами конца буфера, что приводит к незаметному удалению значений. Это не должно использоваться, если вы не уверены в правильности. По умолчанию false.

buf.writeFloatLE (значение, смещение [, noAssert])

Записывает значение в буфер с указанным смещением в указанном формате с прямым порядком байтов. Обратите внимание, что значение должно быть допустимым 32-разрядным числом с плавающей запятой. Установите для noAssert значение true, чтобы пропустить проверку значения и смещения. Это означает, что значение может быть слишком большим для конкретной функции, и смещение может быть за пределами конца буфера, что приводит к бесшумному отбрасыванию значений. Он не должен использоваться, если вы не уверены в его правильности. По умолчанию false.

buf.writeFloatBE (значение, смещение [, noAssert])

Записывает значение в буфер с указанным смещением в указанном формате с прямым порядком байтов. Обратите внимание, значение должно быть допустимым 32-разрядным числом с плавающей точкой. Установите для noAssert значение true, чтобы пропустить проверку значения и смещения. Это означает, что значение может быть слишком большим для конкретной функции, а смещение может быть за пределами конца буфера, что приводит к незаметному удалению значений. Он не должен использоваться, если вы не уверены в его правильности. По умолчанию false.

buf.writeDoubleLE (значение, смещение [, noAssert])

Записывает значение в буфер с указанным смещением в указанном формате с прямым порядком байтов. Обратите внимание, что значение должно быть действительным 64-битным двойным. Установите для noAssert значение true, чтобы пропустить проверку значения и смещения. Это означает, что значение может быть слишком большим для конкретной функции, а смещение может быть за пределами конца буфера, что приводит к тому, что значения отбрасываются без вывода сообщений. Он не должен использоваться, если вы не уверены в его правильности. По умолчанию false.

buf.writeDoubleBE (значение, смещение [, noAssert])

Записывает значение в буфер с указанным смещением в указанном формате с прямым порядком байтов. Обратите внимание, что значение должно быть действительным 64-битным двойным. Установите для noAssert значение true, чтобы пропустить проверку значения и смещения. Это означает, что значение может быть слишком большим для конкретной функции, а смещение может быть за пределами конца буфера, что приводит к незаметному удалению значений. Он не должен использоваться, если вы не уверены в его правильности. По умолчанию false.

buf.fill (значение [, смещение] [, конец])

Заполняет буфер указанным значением. Если смещение (по умолчанию 0) и конец (по умолчанию buffer.length) не заданы, он заполнит весь буфер.

Методы класса

Sr.No. Метод и описание
1

Buffer.isEncoding (кодирование)

Возвращает true, если кодировка является допустимым аргументом кодировки, в противном случае — false.

2

Buffer.isBuffer (OBJ)

Проверяет, является ли obj буфером.

3

Buffer.byteLength (строка [, кодировка])

Дает фактическую длину байта строки. по умолчанию используется кодировка utf8. Это не то же самое, что String.prototype.length, поскольку String.prototype.length возвращает количество символов в строке.

4

Buffer.concat (list [, totalLength])

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

5

Buffer.compare (buf1, buf2)

Так же, как buf1.compare (buf2). Полезно для сортировки массива буферов.

Buffer.isEncoding (кодирование)

Возвращает true, если кодировка является допустимым аргументом кодировки, в противном случае — false.

Buffer.isBuffer (OBJ)

Проверяет, является ли obj буфером.

Buffer.byteLength (строка [, кодировка])

Дает фактическую длину байта строки. по умолчанию используется кодировка utf8. Это не то же самое, что String.prototype.length, поскольку String.prototype.length возвращает количество символов в строке.

Buffer.concat (list [, totalLength])

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

Buffer.compare (buf1, buf2)

Так же, как buf1.compare (buf2). Полезно для сортировки массива буферов.

Node.js — потоки

Что такое потоки?

Потоки — это объекты, которые позволяют непрерывно читать данные из источника или записывать данные в пункт назначения. В Node.js есть четыре типа потоков:

  • Readable — Поток, который используется для операции чтения.

  • Writable — Поток, который используется для операции записи.

  • Дуплекс — Поток, который можно использовать как для чтения, так и для записи.

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

Readable — Поток, который используется для операции чтения.

Writable — Поток, который используется для операции записи.

Дуплекс — Поток, который можно использовать как для чтения, так и для записи.

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

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

  • data — это событие вызывается, когда есть данные, доступные для чтения.

  • end — это событие вызывается, когда больше нет данных для чтения.

  • error — это событие вызывается при любой ошибке при получении или записи данных.

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

data — это событие вызывается, когда есть данные, доступные для чтения.

end — это событие вызывается, когда больше нет данных для чтения.

error — это событие вызывается при любой ошибке при получении или записи данных.

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

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

Чтение из потока

Создайте текстовый файл с именем input.txt следующего содержания:

Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Создайте js-файл с именем main.js со следующим кодом —

var fs = require("fs");
var data = '';

// Create a readable stream
var readerStream = fs.createReadStream('input.txt');

// Set the encoding to be utf8. 
readerStream.setEncoding('UTF8');

// Handle stream events --> data, end, and error
readerStream.on('data', function(chunk) {
   data += chunk;
});

readerStream.on('end',function() {
   console.log(data);
});

readerStream.on('error', function(err) {
   console.log(err.stack);
});

console.log("Program Ended");

Теперь запустите main.js, чтобы увидеть результат —

$ node main.js

Проверьте вывод.

Program Ended
Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Запись в поток

Создайте js-файл с именем main.js со следующим кодом —

Live Demo

var fs = require("fs");
var data = 'Simply Easy Learning';

// Create a writable stream
var writerStream = fs.createWriteStream('output.txt');

// Write the data to stream with encoding to be utf8
writerStream.write(data,'UTF8');

// Mark the end of file
writerStream.end();

// Handle stream events --> finish, and error
writerStream.on('finish', function() {
   console.log("Write completed.");
});

writerStream.on('error', function(err) {
   console.log(err.stack);
});

console.log("Program Ended");

Теперь запустите main.js, чтобы увидеть результат —

$ node main.js

Проверьте вывод.

Program Ended
Write completed.

Теперь откройте файл output.txt, созданный в вашем текущем каталоге; он должен содержать следующее —

Simply Easy Learning

Трубить потоки

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

Создайте js-файл с именем main.js со следующим кодом —

var fs = require("fs");

// Create a readable stream
var readerStream = fs.createReadStream('input.txt');

// Create a writable stream
var writerStream = fs.createWriteStream('output.txt');

// Pipe the read and write operations
// read input.txt and write data to output.txt
readerStream.pipe(writerStream);

console.log("Program Ended");

Теперь запустите main.js, чтобы увидеть результат —

$ node main.js

Проверьте вывод.

Program Ended

Откройте файл output.txt, созданный в вашем текущем каталоге; он должен содержать следующее —

Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Цепные потоки

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

Создайте js-файл с именем main.js со следующим кодом —

var fs = require("fs");
var zlib = require('zlib');

// Compress the file input.txt to input.txt.gz
fs.createReadStream('input.txt')
   .pipe(zlib.createGzip())
   .pipe(fs.createWriteStream('input.txt.gz'));
  
console.log("File Compressed.");

Теперь запустите main.js, чтобы увидеть результат —

$ node main.js

Проверьте вывод.

File Compressed.

Вы обнаружите, что input.txt был сжат, и он создал файл input.txt.gz в текущем каталоге. Теперь давайте попробуем распаковать тот же файл, используя следующий код —

var fs = require("fs");
var zlib = require('zlib');

// Decompress the file input.txt.gz to input.txt
fs.createReadStream('input.txt.gz')
   .pipe(zlib.createGunzip())
   .pipe(fs.createWriteStream('input.txt'));
  
console.log("File Decompressed.");

Теперь запустите main.js, чтобы увидеть результат —

$ node main.js

Проверьте вывод.

File Decompressed.

Node.js — Файловая система

Node реализует файловый ввод / вывод, используя простые обертки вокруг стандартных функций POSIX. Модуль Node File System (fs) можно импортировать, используя следующий синтаксис:

var fs = require("fs")

Синхронный против Асинхронного

Каждый метод в модуле fs имеет как синхронные, так и асинхронные формы. Асинхронные методы принимают последний параметр в качестве функции обратного вызова завершения и первый параметр функции обратного вызова в качестве ошибки. Лучше использовать асинхронный метод вместо синхронного, поскольку первый никогда не блокирует программу во время ее выполнения, а второй — нет.

пример

Создайте текстовый файл с именем input.txt со следующим содержанием —

Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Давайте создадим js-файл с именем main.js со следующим кодом —

var fs = require("fs");

// Asynchronous read
fs.readFile('input.txt', function (err, data) {
   if (err) {
      return console.error(err);
   }
   console.log("Asynchronous read: " + data.toString());
});

// Synchronous read
var data = fs.readFileSync('input.txt');
console.log("Synchronous read: " + data.toString());

console.log("Program Ended");

Теперь запустите main.js, чтобы увидеть результат —

$ node main.js

Проверьте вывод.

Synchronous read: Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Program Ended
Asynchronous read: Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

В следующих разделах этой главы представлен ряд хороших примеров основных методов файлового ввода-вывода.

Открыть файл

Синтаксис

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

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

параметры

Вот описание используемых параметров —

  • путь — это строка с именем файла, включая путь.

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

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

  • callback — это функция обратного вызова, которая получает два аргумента (err, fd).

путь — это строка с именем файла, включая путь.

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

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

callback — это функция обратного вызова, которая получает два аргумента (err, fd).

Флаги

Флаги для операций чтения / записи —

Sr.No. Флаг и описание
1

р

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

2

г +

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

3

RS

Открыть файл для чтения в синхронном режиме.

4

RS +

Откройте файл для чтения и записи, попросив ОС открыть его синхронно. См. Примечания для «rs» об использовании этого с осторожностью.

5

вес

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

6

WX

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

7

ш +

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

8

WX +

Подобно ‘w +’, но не работает, если путь существует.

9

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

10

топор

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

11

а +

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

12

ах +

Как «+», но не работает, если путь существует.

р

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

г +

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

RS

Открыть файл для чтения в синхронном режиме.

RS +

Откройте файл для чтения и записи, попросив ОС открыть его синхронно. См. Примечания для «rs» об использовании этого с осторожностью.

вес

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

WX

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

ш +

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

WX +

Подобно ‘w +’, но не работает, если путь существует.

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

топор

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

а +

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

ах +

Как «+», но не работает, если путь существует.

пример

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

var fs = require("fs");

// Asynchronous - Opening File
console.log("Going to open file!");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
      return console.error(err);
   }
   console.log("File opened successfully!");     
});

Теперь запустите main.js, чтобы увидеть результат —

$ node main.js

Проверьте вывод.

Going to open file!
File opened successfully!

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

Синтаксис

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

fs.stat(path, callback)

параметры

Вот описание используемых параметров —

  • путь — это строка с именем файла, включая путь.

  • callback — это функция обратного вызова, которая получает два аргумента (err, stats), где stats — это объект типа fs.Stats, который напечатан ниже в примере.

путь — это строка с именем файла, включая путь.

callback — это функция обратного вызова, которая получает два аргумента (err, stats), где stats — это объект типа fs.Stats, который напечатан ниже в примере.

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

Sr.No. Метод и описание
1

stats.isFile ()

Возвращает true, если тип файла простого файла.

2

stats.isDirectory ()

Возвращает true, если тип файла каталога.

3

stats.isBlockDevice ()

Возвращает true, если тип файла блочного устройства.

4

stats.isCharacterDevice ()

Возвращает true, если тип файла символьного устройства.

5

stats.isSymbolicLink ()

Возвращает true, если тип файла символической ссылки.

6

stats.isFIFO ()

Возвращает истину, если тип файла FIFO.

7

stats.isSocket ()

Возвращает true, если тип файла asocket.

stats.isFile ()

Возвращает true, если тип файла простого файла.

stats.isDirectory ()

Возвращает true, если тип файла каталога.

stats.isBlockDevice ()

Возвращает true, если тип файла блочного устройства.

stats.isCharacterDevice ()

Возвращает true, если тип файла символьного устройства.

stats.isSymbolicLink ()

Возвращает true, если тип файла символической ссылки.

stats.isFIFO ()

Возвращает истину, если тип файла FIFO.

stats.isSocket ()

Возвращает true, если тип файла asocket.

пример

Давайте создадим js-файл с именем main.js со следующим кодом —

var fs = require("fs");

console.log("Going to get file info!");
fs.stat('input.txt', function (err, stats) {
   if (err) {
      return console.error(err);
   }
   console.log(stats);
   console.log("Got file info successfully!");
   
   // Check file type
   console.log("isFile ? " + stats.isFile());
   console.log("isDirectory ? " + stats.isDirectory());    
});

Теперь запустите main.js, чтобы увидеть результат —

$ node main.js

Проверьте вывод.

Going to get file info!
{ 
   dev: 1792,
   mode: 33188,
   nlink: 1,
   uid: 48,
   gid: 48,
   rdev: 0,
   blksize: 4096,
   ino: 4318127,
   size: 97,
   blocks: 8,
   atime: Sun Mar 22 2015 13:40:00 GMT-0500 (CDT),
   mtime: Sun Mar 22 2015 13:40:57 GMT-0500 (CDT),
   ctime: Sun Mar 22 2015 13:40:57 GMT-0500 (CDT) 
}
Got file info successfully!
isFile ? true
isDirectory ? false

Написание файла

Синтаксис

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

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

Этот метод перезапишет файл, если файл уже существует. Если вы хотите записать в существующий файл, вам следует использовать другой доступный метод.

параметры

Вот описание используемых параметров —

  • путь — это строка с именем файла, включая путь.

  • data — это строка или буфер, который будет записан в файл.

  • options — Третий параметр — это объект, который будет содержать {encoding, mode, flag}. По умолчанию. кодировка — utf8, режим — восьмеричное значение 0666. и флаг — ‘w’

  • callback — это функция обратного вызова, которая получает один параметр err, который возвращает ошибку в случае любой ошибки записи.

путь — это строка с именем файла, включая путь.

data — это строка или буфер, который будет записан в файл.

options — Третий параметр — это объект, который будет содержать {encoding, mode, flag}. По умолчанию. кодировка — utf8, режим — восьмеричное значение 0666. и флаг — ‘w’

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

пример

Давайте создадим js-файл с именем main.js, имеющий следующий код —

Live Demo

var fs = require("fs");

console.log("Going to write into existing file");
fs.writeFile('input.txt', 'Simply Easy Learning!', function(err) {
   if (err) {
      return console.error(err);
   }
   
   console.log("Data written successfully!");
   console.log("Let's read newly written data");
   
   fs.readFile('input.txt', function (err, data) {
      if (err) {
         return console.error(err);
      }
      console.log("Asynchronous read: " + data.toString());
   });
});

Теперь запустите main.js, чтобы увидеть результат —

$ node main.js

Проверьте вывод.

Going to write into existing file
Data written successfully!
Let's read newly written data
Asynchronous read: Simply Easy Learning!

Чтение файла

Синтаксис

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

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

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

параметры

Вот описание используемых параметров —

  • fd — это дескриптор файла, возвращаемый функцией fs.open ().

  • буфер — это буфер, в который будут записаны данные.

  • смещение — это смещение в буфере, с которого начинается запись.

  • длина — это целое число, указывающее количество байтов для чтения.

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

  • callback — это функция обратного вызова, которая получает три аргумента (err, bytesRead, buffer).

fd — это дескриптор файла, возвращаемый функцией fs.open ().

буфер — это буфер, в который будут записаны данные.

смещение — это смещение в буфере, с которого начинается запись.

длина — это целое число, указывающее количество байтов для чтения.

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

callback — это функция обратного вызова, которая получает три аргумента (err, bytesRead, buffer).

пример

Давайте создадим js-файл с именем main.js со следующим кодом —

var fs = require("fs");
var buf = new Buffer(1024);

console.log("Going to open an existing file");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
      return console.error(err);
   }
   console.log("File opened successfully!");
   console.log("Going to read the file");
   
   fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
      if (err){
         console.log(err);
      }
      console.log(bytes + " bytes read");
      
      // Print only read bytes to avoid junk.
      if(bytes > 0){
         console.log(buf.slice(0, bytes).toString());
      }
   });
});

Теперь запустите main.js, чтобы увидеть результат —

$ node main.js

Проверьте вывод.

Going to open an existing file
File opened successfully!
Going to read the file
97 bytes read
Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Закрытие файла

Синтаксис

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

fs.close(fd, callback)

параметры

Вот описание используемых параметров —

  • fd — это дескриптор файла, возвращаемый методом file fs.open ().

  • callback — это функция обратного вызова. Никакие аргументы, кроме возможного исключения, не передаются для обратного вызова завершения.

fd — это дескриптор файла, возвращаемый методом file fs.open ().

callback — это функция обратного вызова. Никакие аргументы, кроме возможного исключения, не передаются для обратного вызова завершения.

пример

Давайте создадим js-файл с именем main.js, имеющий следующий код —

var fs = require("fs");
var buf = new Buffer(1024);

console.log("Going to open an existing file");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
      return console.error(err);
   }
   console.log("File opened successfully!");
   console.log("Going to read the file");
   
   fs.read(fd, buf, 0, buf.length, 0, function(err, bytes) {
      if (err) {
         console.log(err);
      }

      // Print only read bytes to avoid junk.
      if(bytes > 0) {
         console.log(buf.slice(0, bytes).toString());
      }

      // Close the opened file.
      fs.close(fd, function(err) {
         if (err) {
            console.log(err);
         } 
         console.log("File closed successfully.");
      });
   });
});

Теперь запустите main.js, чтобы увидеть результат —

$ node main.js

Проверьте вывод.

Going to open an existing file
File opened successfully!
Going to read the file
Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

File closed successfully.

Усекать файл

Синтаксис

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

fs.ftruncate(fd, len, callback)

параметры

Вот описание используемых параметров —

  • fd — это дескриптор файла, возвращаемый функцией fs.open ().

  • len — это длина файла, после которой файл будет обрезан.

  • callback — это функция обратного вызова. Никакие аргументы, кроме возможного исключения, не передаются для обратного вызова завершения.

fd — это дескриптор файла, возвращаемый функцией fs.open ().

len — это длина файла, после которой файл будет обрезан.

callback — это функция обратного вызова. Никакие аргументы, кроме возможного исключения, не передаются для обратного вызова завершения.

пример

Давайте создадим js-файл с именем main.js, имеющий следующий код —

var fs = require("fs");
var buf = new Buffer(1024);

console.log("Going to open an existing file");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
      return console.error(err);
   }
   console.log("File opened successfully!");
   console.log("Going to truncate the file after 10 bytes");
   
   // Truncate the opened file.
   fs.ftruncate(fd, 10, function(err) {
      if (err) {
         console.log(err);
      } 
      console.log("File truncated successfully.");
      console.log("Going to read the same file"); 
      
      fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
         if (err) {
            console.log(err);
         }

         // Print only read bytes to avoid junk.
         if(bytes > 0) {
            console.log(buf.slice(0, bytes).toString());
         }

         // Close the opened file.
         fs.close(fd, function(err) {
            if (err) {
               console.log(err);
            } 
            console.log("File closed successfully.");
         });
      });
   });
});

Теперь запустите main.js, чтобы увидеть результат —

$ node main.js

Проверьте вывод.

Going to open an existing file
File opened successfully!
Going to truncate the file after 10 bytes
File truncated successfully.
Going to read the same file
Tutorials 
File closed successfully.

Удалить файл

Синтаксис

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

fs.unlink(path, callback)

параметры

Вот описание используемых параметров —

  • путь — это имя файла, включая путь.

  • callback — это функция обратного вызова. Никакие аргументы, кроме возможного исключения, не передаются для обратного вызова завершения.

путь — это имя файла, включая путь.

callback — это функция обратного вызова. Никакие аргументы, кроме возможного исключения, не передаются для обратного вызова завершения.

пример

Давайте создадим js-файл с именем main.js, имеющий следующий код —

var fs = require("fs");

console.log("Going to delete an existing file");
fs.unlink('input.txt', function(err) {
   if (err) {
      return console.error(err);
   }
   console.log("File deleted successfully!");
});

Теперь запустите main.js, чтобы увидеть результат —

$ node main.js

Проверьте вывод.

Going to delete an existing file
File deleted successfully!

Создать каталог

Синтаксис

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

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

параметры

Вот описание используемых параметров —

  • путь — это имя каталога, включая путь.

  • mode — это разрешение каталога, которое нужно установить. По умолчанию 0777.

  • callback — это функция обратного вызова. Никакие аргументы, кроме возможного исключения, не передаются для обратного вызова завершения.

путь — это имя каталога, включая путь.

mode — это разрешение каталога, которое нужно установить. По умолчанию 0777.

callback — это функция обратного вызова. Никакие аргументы, кроме возможного исключения, не передаются для обратного вызова завершения.

пример

Давайте создадим js-файл с именем main.js, имеющий следующий код —

var fs = require("fs");

console.log("Going to create directory /tmp/test");
fs.mkdir('/tmp/test',function(err) {
   if (err) {
      return console.error(err);
   }
   console.log("Directory created successfully!");
});

Теперь запустите main.js, чтобы увидеть результат —

$ node main.js

Проверьте вывод.

Going to create directory /tmp/test
Directory created successfully!

Читать каталог

Синтаксис

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

fs.readdir(path, callback)

параметры

Вот описание используемых параметров —

  • путь — это имя каталога, включая путь.

  • callback — это функция обратного вызова, которая получает два аргумента (err, files), где files — это массив имен файлов в каталоге, исключая ‘.’ а также ‘..’.

путь — это имя каталога, включая путь.

callback — это функция обратного вызова, которая получает два аргумента (err, files), где files — это массив имен файлов в каталоге, исключая ‘.’ а также ‘..’.

пример

Давайте создадим js-файл с именем main.js, имеющий следующий код —

var fs = require("fs");

console.log("Going to read directory /tmp");
fs.readdir("/tmp/",function(err, files) {
   if (err) {
      return console.error(err);
   }
   files.forEach( function (file) {
      console.log( file );
   });
});

Теперь запустите main.js, чтобы увидеть результат —

$ node main.js

Проверьте вывод.

Going to read directory /tmp
ccmzx99o.out
ccyCSbkF.out
employee.ser
hsperfdata_apache
test
test.txt

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

Синтаксис

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

fs.rmdir(path, callback)

параметры

Вот описание используемых параметров —

  • путь — это имя каталога, включая путь.

  • callback — это функция обратного вызова. Никакие аргументы, кроме возможного исключения, не передаются для обратного вызова завершения.

путь — это имя каталога, включая путь.

callback — это функция обратного вызова. Никакие аргументы, кроме возможного исключения, не передаются для обратного вызова завершения.

пример

Давайте создадим js-файл с именем main.js, имеющий следующий код —

var fs = require("fs");

console.log("Going to delete directory /tmp/test");
fs.rmdir("/tmp/test",function(err) {
   if (err) {
      return console.error(err);
   }
   console.log("Going to read directory /tmp");
   
   fs.readdir("/tmp/",function(err, files) {
      if (err) {
         return console.error(err);
      }
      files.forEach( function (file) {
         console.log( file );
      });
   });
});

Теперь запустите main.js, чтобы увидеть результат —

$ node main.js

Проверьте вывод.

Going to read directory /tmp
ccmzx99o.out
ccyCSbkF.out
employee.ser
hsperfdata_apache
test.txt

Справочник по методам

fs.rename (oldPath, newPath, callback)

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

fs.ftruncate (fd, len, callback)

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

fs.ftruncateSync (fd, len)

Синхронный ftruncate ().

fs.truncate (путь, лен, обратный вызов)

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

fs.truncateSync (путь, длина)

Синхронное усечение ().

fs.chown (путь, uid, gid, обратный вызов)

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

fs.chownSync (путь, UID, GID)

Синхронный чоун ().

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

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

fs.fchownSync (fd, uid, gid)

Синхронный fchown ().

fs.lchown (путь, uid, gid, обратный вызов)

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

fs.lchownSync (путь, uid, gid)

Синхронный lchown ().

fs.chmod (путь, режим, обратный вызов)

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

fs.chmodSync (путь, режим)

Синхронный chmod ().

fs.fchmod (fd, mode, callback)

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

fs.fchmodSync (fd, mode)

Синхронный fchmod ().

fs.lchmod (путь, режим, обратный вызов)

Асинхронный lchmod (). Никакие аргументы, кроме возможного исключения, не передаются для обратного вызова завершения. Доступно только в Mac OS X.

fs.lchmodSync (путь, режим)

Синхронный lchmod ().

fs.stat (путь, обратный вызов)

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

fs.lstat (путь, обратный вызов)

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

fs.fstat (fd, обратный вызов)

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

fs.statSync (путь)

Синхронный стат (). Возвращает экземпляр fs.Stats.

fs.lstatSync (путь)

Синхронный lstat (). Возвращает экземпляр fs.Stats.

fs.fstatSync (FD)

Синхронный fstat (). Возвращает экземпляр fs.Stats.

fs.link (srcpath, dstpath, callback)

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

fs.linkSync (srcpath, dstpath)

Синхронная ссылка ().

fs.symlink (srcpath, dstpath [, type], callback)

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

fs.symlinkSync (srcpath, dstpath [, type])

Синхронная символическая ссылка ().

fs.readlink (путь, обратный вызов)

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

fs.realpath (путь [, кэш], обратный вызов)

Асинхронный реальный путь (). Обратный вызов получает два аргумента (err, resolvedPath). Может использовать process.cwd для разрешения относительных путей. Кэш — это объектный литерал отображаемых путей, который можно использовать для принудительного разрешения определенного пути или для исключения дополнительных вызовов fs.stat для известных реальных путей.

fs.realpathSync (путь [, кэш])

Синхронный реальный путь (). Возвращает разрешенный путь.

fs.unlink (путь, обратный вызов)

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

fs.unlinkSync (путь)

Синхронный unlink ().

fs.rmdir (путь, обратный вызов)

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

fs.rmdirSync (путь)

Синхронный rmdir ().

fs.mkdir (путь [, режим], обратный вызов)

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

fs.mkdirSync (путь [, режим])

Синхронный MKDIR ().

fs.readdir (путь, обратный вызов)

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

fs.readdirSync (путь)

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

fs.close (fd, обратный вызов)

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

fs.closeSync (FD)

Синхронное закрытие ().

fs.open (путь, флаги [, режим], обратный вызов)

Открытие асинхронного файла.

fs.openSync (путь, флаги [, режим])

Синхронная версия fs.open ().

fs.utimes (путь, atime, mtime, обратный вызов)

fs.utimesSync (путь, atime, mtime)

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

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

fs.futimesSync (fd, atime, mtime)

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

fs.fsync (fd, обратный вызов)

Асинхронный Fsync. Никакие аргументы, кроме возможного исключения, не передаются для обратного вызова завершения.

fs.fsyncSync (FD)

Синхронный fsync.

fs.write (fd, буфер, смещение, длина [, позиция], обратный вызов)

Записать буфер в файл, указанный в fd.

fs.write (fd, data [, position [, encoding]], обратный вызов)

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

fs.writeSync (fd, буфер, смещение, длина [, позиция])

Синхронные версии fs.write (). Возвращает количество записанных байтов.

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

Синхронные версии fs.write (). Возвращает количество записанных байтов.

fs.read (fd, буфер, смещение, длина, позиция, обратный вызов)

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

fs.readSync (fd, буфер, смещение, длина, позиция)

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

fs.readFile (имя файла [, параметры], обратный вызов)

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

fs.readFileSync (имя файла [, параметры])

Синхронная версия fs.readFile. Возвращает содержимое имени файла.

fs.writeFile (имя файла, данные [, параметры], обратный вызов)

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

fs.writeFileSync (имя файла, данные [, параметры])

Синхронная версия fs.writeFile.

fs.appendFile (имя файла, данные [, параметры], обратный вызов)

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

fs.appendFileSync (имя файла, данные [, параметры])

Синхронная версия fs.appendFile.

fs.watchFile (имя файла [, параметры], слушатель)

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

fs.unwatchFile (имя файла [, слушатель])

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

fs.watch (имя файла [, параметры] [, слушатель])

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

fs.exists (путь, обратный вызов)

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

fs.existsSync (путь)

Синхронная версия fs.exists.

fs.access (путь [, режим], обратный вызов)

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

fs.accessSync (путь [, режим])

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

fs.createReadStream (путь [, параметры])

Возвращает новый объект ReadStream.

fs.createWriteStream (путь [, параметры])

Возвращает новый объект WriteStream.

fs.symlink (srcpath, dstpath [, type], callback)

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

Node.js — глобальные объекты

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

__имя файла

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

пример

Создайте js-файл с именем main.js со следующим кодом —

Live Demo

// Let's try to print the value of __filename

console.log( __filename );

Теперь запустите main.js, чтобы увидеть результат —

$ node main.js

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

/web/com/1427091028_21099/main.js

__dirname

__Dirname представляет имя каталога, в котором находится текущий исполняемый скрипт.

пример

Создайте js-файл с именем main.js со следующим кодом —

Live Demo

// Let's try to print the value of __dirname

console.log( __dirname );

Теперь запустите main.js, чтобы увидеть результат —

$ node main.js

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

/web/com/1427091028_21099

setTimeout (кб, мс)

Глобальная функция setTimeout (cb, ms) используется для запуска обратного вызова cb по крайней мере через миллисекунды. Фактическая задержка зависит от внешних факторов, таких как детализация таймера ОС и загрузка системы. Таймер не может занимать более 24,8 дней.

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

пример

Создайте js-файл с именем main.js со следующим кодом —

Live Demo

function printHello() {
   console.log( "Hello, World!");
}

// Now call above function after 2 seconds
setTimeout(printHello, 2000);

Теперь запустите main.js, чтобы увидеть результат —

$ node main.js

Убедитесь, что вывод распечатан после небольшой задержки.

Hello, World!

clearTimeout (т)

Глобальная функция clearTimeout (t) используется для остановки таймера, который был ранее создан с помощью setTimeout (). Здесь t — таймер, возвращаемый функцией setTimeout ().

пример

Создайте js-файл с именем main.js со следующим кодом —

Live Demo

function printHello() {
   console.log( "Hello, World!");
}

// Now call above function after 2 seconds
var t = setTimeout(printHello, 2000);

// Now clear the timer
clearTimeout(t);

Теперь запустите main.js, чтобы увидеть результат —

$ node main.js

Проверьте вывод, где вы не найдете ничего напечатанного.

setInterval (кб, мс)

Глобальная функция setInterval (cb, ms) используется для многократного запуска обратного вызова cb по крайней мере через миллисекунды. Фактическая задержка зависит от внешних факторов, таких как детализация таймера ОС и загрузка системы. Таймер не может занимать более 24,8 дней.

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

пример

Создайте js-файл с именем main.js со следующим кодом —

Live Demo

function printHello() {
   console.log( "Hello, World!");
}

// Now call above function after 2 seconds
setInterval(printHello, 2000);

Теперь запустите main.js, чтобы увидеть результат —

$ node main.js

Вышеуказанная программа будет выполнять printHello () через каждые 2 секунды. Из-за системного ограничения.

Глобальные объекты

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

Sr.No. Название и описание модуля
1 Приставка

Используется для печати информации на stdout и stderr.

2 Процесс

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

Используется для печати информации на stdout и stderr.

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

Node.js — служебные модули

В библиотеке модулей Node.js доступно несколько служебных модулей. Эти модули очень распространены и часто используются при разработке любого Node-приложения.

Sr.No. Название и описание модуля
1 Модуль ОС

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

2 Путь Модуль

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

3 Сетевой модуль

Предоставляет как серверы, так и клиенты в виде потоков. Действует как сетевая оболочка.

4 Модуль DNS

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

5 Доменный модуль

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

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

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

Предоставляет как серверы, так и клиенты в виде потоков. Действует как сетевая оболочка.

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

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

Node.js — веб-модуль

Что такое веб-сервер?

Веб-сервер — это программное приложение, которое обрабатывает HTTP-запросы, отправляемые HTTP-клиентом, например веб-браузерами, и возвращает веб-страницы в ответ клиентам. Веб-серверы обычно предоставляют HTML-документы вместе с изображениями, таблицами стилей и сценариями.

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

Веб-сервер Apache является одним из наиболее часто используемых веб-серверов. Это проект с открытым исходным кодом.

Архитектура веб-приложений

Веб-приложение обычно делится на четыре слоя —

Веб-архитектура

  • Клиент — этот слой состоит из веб-браузеров, мобильных браузеров или приложений, которые могут отправлять HTTP-запросы на веб-сервер.

  • Сервер — этот уровень имеет веб-сервер, который может перехватывать запросы клиентов и передавать им ответ.

  • Бизнес. Этот уровень содержит сервер приложений, который используется веб-сервером для выполнения необходимой обработки. Этот уровень взаимодействует с уровнем данных через базу данных или некоторые внешние программы.

  • Данные — этот слой содержит базы данных или любой другой источник данных.

Клиент — этот слой состоит из веб-браузеров, мобильных браузеров или приложений, которые могут отправлять HTTP-запросы на веб-сервер.

Сервер — этот уровень имеет веб-сервер, который может перехватывать запросы клиентов и передавать им ответ.

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

Данные — этот слой содержит базы данных или любой другой источник данных.

Создание веб-сервера с использованием Node

Node.js предоставляет модуль http, который можно использовать для создания HTTP-клиента сервера. Ниже приведена минимальная структура HTTP-сервера, который прослушивает порт 8081.

Создайте файл js с именем server.js —

Файл: server.js

var http = require('http');
var fs = require('fs');
var url = require('url');

// Create a server
http.createServer( function (request, response) {  
   // Parse the request containing file name
   var pathname = url.parse(request.url).pathname;
   
   // Print the name of the file for which request is made.
   console.log("Request for " + pathname + " received.");
   
   // Read the requested file content from file system
   fs.readFile(pathname.substr(1), function (err, data) {
      if (err) {
         console.log(err);
         
         // HTTP Status: 404 : NOT FOUND
         // Content Type: text/plain
         response.writeHead(404, {'Content-Type': 'text/html'});
      } else {	
         //Page found	  
         // HTTP Status: 200 : OK
         // Content Type: text/plain
         response.writeHead(200, {'Content-Type': 'text/html'});	
         
         // Write the content of the file to response body
         response.write(data.toString());		
      }
      
      // Send the response body 
      response.end();
   });   
}).listen(8081);

// Console will print the message
console.log('Server running at http://127.0.0.1:8081/');

Теперь давайте создадим следующий HTML-файл с именем index.htm в том же каталоге, где вы создали server.js.

Файл: index.htm

<html>
   <head>
      <title>Sample Page</title>
   </head>
   
   <body>
      Hello World!
   </body>
</html>

Теперь давайте запустим server.js, чтобы увидеть результат —

$ node server.js

Проверьте вывод.

Server running at http://127.0.0.1:8081/

Сделать запрос к серверу Node.js

Откройте http://127.0.0.1:8081/index.htm в любом браузере, чтобы увидеть следующий результат.

Первое серверное приложение

Проверьте вывод на конце сервера.

Server running at http://127.0.0.1:8081/
Request for /index.htm received.

Создание веб-клиента с использованием Node

Веб-клиент может быть создан с использованием модуля http . Давайте проверим следующий пример.

Создайте файл js с именем client.js —

Файл: client.js

var http = require('http');

// Options to be used by request 
var options = {
   host: 'localhost',
   port: '8081',
   path: '/index.htm'  
};

// Callback function is used to deal with response
var callback = function(response) {
   // Continuously update stream with data
   var body = '';
   response.on('data', function(data) {
      body += data;
   });
   
   response.on('end', function() {
      // Data received completely.
      console.log(body);
   });
}
// Make a request to the server
var req = http.request(options, callback);
req.end();

Теперь запустите client.js из другого командного терминала, отличного от server.js, чтобы увидеть результат —

$ node client.js

Проверьте вывод.

<html>
   <head>
      <title>Sample Page</title>
   </head>
   
   <body>
      Hello World!
   </body>
</html>

Проверьте вывод на конце сервера.

Server running at http://127.0.0.1:8081/
Request for /index.htm received.

Node.js — Express Framework

Экспресс Обзор

Express — это минимальная и гибкая среда веб-приложений Node.js, предоставляющая надежный набор функций для разработки веб-приложений и мобильных приложений. Это способствует быстрой разработке веб-приложений на основе Node. Ниже приведены некоторые из основных функций Express Framework —

  • Позволяет настроить промежуточное ПО для ответа на HTTP-запросы.

  • Определяет таблицу маршрутизации, которая используется для выполнения различных действий на основе метода HTTP и URL-адреса.

  • Позволяет динамически отображать HTML-страницы на основе передачи аргументов в шаблоны.

Позволяет настроить промежуточное ПО для ответа на HTTP-запросы.

Определяет таблицу маршрутизации, которая используется для выполнения различных действий на основе метода HTTP и URL-адреса.

Позволяет динамически отображать HTML-страницы на основе передачи аргументов в шаблоны.

Установка Экспресс

Во-первых, установите платформу Express глобально с помощью NPM, чтобы ее можно было использовать для создания веб-приложения с использованием терминала терминала.

$ npm install express --save

Приведенная выше команда сохраняет установку локально в каталоге node_modules и создает экспресс-каталог внутри node_modules. Вы должны установить следующие важные модули вместе с экспресс —

  • body-parser — это промежуточное программное обеспечение node.js для обработки данных форм в кодировке JSON, Raw, Text и URL.

  • cookie-parser — анализирует заголовок Cookie и заполняет req.cookies объектом, обозначенным именами cookie.

  • multer — это промежуточное программное обеспечение node.js для обработки multipart / form-data.

body-parser — это промежуточное программное обеспечение node.js для обработки данных форм в кодировке JSON, Raw, Text и URL.

cookie-parser — анализирует заголовок Cookie и заполняет req.cookies объектом, обозначенным именами cookie.

multer — это промежуточное программное обеспечение node.js для обработки multipart / form-data.

$ npm install body-parser --save
$ npm install cookie-parser --save
$ npm install multer --save

Привет мир Пример

Ниже приведено очень простое приложение Express, которое запускает сервер и прослушивает порт 8081 для подключения. Это приложение отвечает Hello World! для запросов на домашнюю страницу. Для каждого другого пути он ответит 404 Not Found.

var express = require('express');
var app = express();

app.get('/', function (req, res) {
   res.send('Hello World');
})

var server = app.listen(8081, function () {
   var host = server.address().address
   var port = server.address().port
   
   console.log("Example app listening at http://%s:%s", host, port)
})

Сохраните приведенный выше код в файле с именем server.js и запустите его с помощью следующей команды.

$ node server.js

Вы увидите следующий вывод —

Example app listening at http://0.0.0.0:8081

Откройте http://127.0.0.1:8081/ в любом браузере, чтобы увидеть следующий результат.

Первое приложение

Ответ на запрос

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

app.get('/', function (req, res) {
   // --
})
  • Объект запроса — объект запроса представляет запрос HTTP и имеет свойства для строки запроса запроса, параметров, тела, заголовков HTTP и т. Д.

  • Объект ответа — объект ответа представляет собой HTTP-ответ, который приложение Express отправляет при получении HTTP-запроса.

Объект запроса — объект запроса представляет запрос HTTP и имеет свойства для строки запроса запроса, параметров, тела, заголовков HTTP и т. Д.

Объект ответа — объект ответа представляет собой HTTP-ответ, который приложение Express отправляет при получении HTTP-запроса.

Вы можете распечатать req и res объекты, которые предоставляют много информации, связанной с HTTP-запросом и ответом, включая куки, сессии, URL и т. Д.

Базовая маршрутизация

Мы видели базовое приложение, которое обслуживает HTTP-запрос для домашней страницы. Маршрутизация относится к определению того, как приложение отвечает на запрос клиента к конкретной конечной точке, которая представляет собой URI (или путь) и конкретный метод HTTP-запроса (GET, POST и т. Д.).

Мы расширим нашу программу Hello World, чтобы обрабатывать больше типов HTTP-запросов.

var express = require('express');
var app = express();

// This responds with "Hello World" on the homepage
app.get('/', function (req, res) {
   console.log("Got a GET request for the homepage");
   res.send('Hello GET');
})

// This responds a POST request for the homepage
app.post('/', function (req, res) {
   console.log("Got a POST request for the homepage");
   res.send('Hello POST');
})

// This responds a DELETE request for the /del_user page.
app.delete('/del_user', function (req, res) {
   console.log("Got a DELETE request for /del_user");
   res.send('Hello DELETE');
})

// This responds a GET request for the /list_user page.
app.get('/list_user', function (req, res) {
   console.log("Got a GET request for /list_user");
   res.send('Page Listing');
})

// This responds a GET request for abcd, abxcd, ab123cd, and so on
app.get('/ab*cd', function(req, res) {   
   console.log("Got a GET request for /ab*cd");
   res.send('Page Pattern Match');
})

var server = app.listen(8081, function () {
   var host = server.address().address
   var port = server.address().port
   
   console.log("Example app listening at http://%s:%s", host, port)
})

Сохраните приведенный выше код в файле с именем server.js и запустите его с помощью следующей команды.

$ node server.js

Вы увидите следующий вывод —

Example app listening at http://0.0.0.0:8081

Теперь вы можете попробовать разные запросы на http://127.0.0.1:8081, чтобы увидеть вывод, сгенерированный server.js. Ниже приведены несколько снимков экрана, на которых показаны разные ответы для разных URL-адресов.

Снова отображается экран http://127.0.0.1:8081/list_user

Второе приложение

Снова появляется экран http://127.0.0.1:8081/abcd

Третье приложение

Снова отображается экран http://127.0.0.1:8081/abcdefg

Четвертое приложение

Обслуживание статических файлов

Express предоставляет встроенное промежуточное программное обеспечение express.static для обслуживания статических файлов, таких как изображения, CSS, JavaScript и т. Д.

Вам просто нужно передать имя каталога, в котором вы храните свои статические ресурсы, промежуточному программному обеспечению express.static, чтобы начать обслуживание файлов напрямую. Например, если вы храните свои изображения, файлы CSS и JavaScript в каталоге с именем public, вы можете сделать это —

app.use(express.static('public'));

Мы будем хранить несколько изображений в подкаталоге public / images следующим образом:

node_modules
server.js
public/
public/images
public/images/logo.png

Давайте изменим приложение «Hello Word», чтобы добавить функциональность для обработки статических файлов.

var express = require('express');
var app = express();

app.use(express.static('public'));

app.get('/', function (req, res) {
   res.send('Hello World');
})

var server = app.listen(8081, function () {
   var host = server.address().address
   var port = server.address().port

   console.log("Example app listening at http://%s:%s", host, port)
})

Сохраните приведенный выше код в файле с именем server.js и запустите его с помощью следующей команды.

$ node server.js

Теперь откройте http://127.0.0.1:8081/images/logo.png в любом браузере и посмотрите, как выглядит следующий результат.

Пятая заявка

ПОЛУЧИТЬ метод

Вот простой пример, который передает два значения, используя метод HTML FORM GET. Мы будем использовать маршрутизатор process_get внутри server.js для обработки этого ввода.

<html>
   <body>
      
      <form action = "http://127.0.0.1:8081/process_get" method = "GET">
         First Name: <input type = "text" name = "first_name">  <br>
         Last Name: <input type = "text" name = "last_name">
         <input type = "submit" value = "Submit">
      </form>
      
   </body>
</html>

Давайте сохраним приведенный выше код в index.htm и изменим server.js для обработки запросов домашней страницы, а также ввода, отправляемого HTML-формой.

var express = require('express');
var app = express();

app.use(express.static('public'));
app.get('/index.htm', function (req, res) {
   res.sendFile( __dirname + "/" + "index.htm" );
})

app.get('/process_get', function (req, res) {
   // Prepare output in JSON format
   response = {
      first_name:req.query.first_name,
      last_name:req.query.last_name
   };
   console.log(response);
   res.end(JSON.stringify(response));
})

var server = app.listen(8081, function () {
   var host = server.address().address
   var port = server.address().port
   
   console.log("Example app listening at http://%s:%s", host, port)
})

Доступ к документу HTML с использованием http://127.0.0.1:8081/index.htm приведет к созданию следующей формы:

First Name:
Last Name:

Теперь вы можете ввести имя и фамилию, а затем нажать кнопку «Отправить», чтобы увидеть результат, и он должен вернуть следующий результат -

{"first_name":"John","last_name":"Paul"}

Метод POST

Вот простой пример, который передает два значения, используя метод HTML FORM POST. Мы будем использовать маршрутизатор process_get внутри server.js для обработки этого ввода.

<html>
   <body>
      
      <form action = "http://127.0.0.1:8081/process_post" method = "POST">
         First Name: <input type = "text" name = "first_name"> <br>
         Last Name: <input type = "text" name = "last_name">
         <input type = "submit" value = "Submit">
      </form>
      
   </body>
</html>

Давайте сохраним приведенный выше код в index.htm и изменим server.js для обработки запросов домашней страницы, а также ввода, отправляемого HTML-формой.

var express = require('express');
var app = express();
var bodyParser = require('body-parser');

// Create application/x-www-form-urlencoded parser
var urlencodedParser = bodyParser.urlencoded({ extended: false })

app.use(express.static('public'));
app.get('/index.htm', function (req, res) {
   res.sendFile( __dirname + "/" + "index.htm" );
})

app.post('/process_post', urlencodedParser, function (req, res) {
   // Prepare output in JSON format
   response = {
      first_name:req.body.first_name,
      last_name:req.body.last_name
   };
   console.log(response);
   res.end(JSON.stringify(response));
})

var server = app.listen(8081, function () {
   var host = server.address().address
   var port = server.address().port
   
   console.log("Example app listening at http://%s:%s", host, port)
})

Доступ к документу HTML с использованием http://127.0.0.1:8081/index.htm приведет к созданию следующей формы:

First Name:
Last Name:

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

{"first_name":"John","last_name":"Paul"}

Файл загружен

Следующий HTML-код создает форму загрузки файла. В этой форме атрибут метода имеет значение POST, а атрибут enctype - multipart / form-data.

<html>
   <head>
      <title>File Uploading Form</title>
   </head>

   <body>
      <h3>File Upload:</h3>
      Select a file to upload: <br />
      
      <form action = "http://127.0.0.1:8081/file_upload" method = "POST" 
         enctype = "multipart/form-data">
         <input type="file" name="file" size="50" />
         <br />
         <input type = "submit" value = "Upload File" />
      </form>
      
   </body>
</html>

Давайте сохраним приведенный выше код в index.htm и изменим server.js для обработки запросов домашней страницы, а также загрузки файлов.

var express = require('express');
var app = express();
var fs = require("fs");

var bodyParser = require('body-parser');
var multer  = require('multer');

app.use(express.static('public'));
app.use(bodyParser.urlencoded({ extended: false }));
app.use(multer({ dest: '/tmp/'}));

app.get('/index.htm', function (req, res) {
   res.sendFile( __dirname + "/" + "index.htm" );
})

app.post('/file_upload', function (req, res) {
   console.log(req.files.file.name);
   console.log(req.files.file.path);
   console.log(req.files.file.type);
   var file = __dirname + "/" + req.files.file.name;
   
   fs.readFile( req.files.file.path, function (err, data) {
      fs.writeFile(file, data, function (err) {
         if( err ) {
            console.log( err );
            } else {
               response = {
                  message:'File uploaded successfully',
                  filename:req.files.file.name
               };
            }
         
         console.log( response );
         res.end( JSON.stringify( response ) );
      });
   });
})

var server = app.listen(8081, function () {
   var host = server.address().address
   var port = server.address().port
   
   console.log("Example app listening at http://%s:%s", host, port)
})

Доступ к документу HTML с использованием http://127.0.0.1:8081/index.htm приведет к созданию следующей формы:

File Upload:
Select a file to upload: 

NOTE: This is just dummy form and would not work, but it must work at your server.

Управление Cookies

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

var express      = require('express')
var cookieParser = require('cookie-parser')

var app = express()
app.use(cookieParser())

app.get('/', function(req, res) {
   console.log("Cookies: ", req.cookies)
})
app.listen(8081)

Node.js - RESTful API

Что такое архитектура REST?

REST означает REpresentational State Transfer. REST - это архитектура, основанная на веб-стандартах и ​​использующая протокол HTTP. Он вращается вокруг ресурса, где каждый компонент является ресурсом, а доступ к ресурсу осуществляется через общий интерфейс с использованием стандартных методов HTTP. REST был впервые представлен Роем Филдингом в 2000 году.

Сервер REST просто предоставляет доступ к ресурсам и клиенту REST, а также изменяет ресурсы с использованием протокола HTTP. Здесь каждый ресурс идентифицируется URI / глобальными идентификаторами. REST использует различные представления для представления таких ресурсов, как текст, JSON, XML, но JSON является наиболее популярным.

Методы HTTP

Следующие четыре HTTP-метода обычно используются в архитектуре на основе REST.

  • GET - используется для доступа к ресурсу только для чтения.

  • PUT - используется для создания нового ресурса.

  • DELETE - используется для удаления ресурса.

  • POST - используется для обновления существующего ресурса или создания нового ресурса.

GET - используется для доступа к ресурсу только для чтения.

PUT - используется для создания нового ресурса.

DELETE - используется для удаления ресурса.

POST - используется для обновления существующего ресурса или создания нового ресурса.

Веб-сервисы RESTful

Веб-сервис - это набор открытых протоколов и стандартов, используемых для обмена данными между приложениями или системами. Программные приложения, написанные на разных языках программирования и работающие на разных платформах, могут использовать веб-сервисы для обмена данными по компьютерным сетям, таким как Интернет, аналогично межпроцессному взаимодействию на одном компьютере. Эта совместимость (например, связь между Java и Python или приложениями Windows и Linux) обусловлена ​​использованием открытых стандартов.

Веб-сервисы на основе архитектуры REST известны как веб-сервисы RESTful. Эти веб-сервисы используют методы HTTP для реализации концепции архитектуры REST. Веб-сервис RESTful обычно определяет URI, унифицированный идентификатор ресурса, сервис, который обеспечивает представление ресурса, такого как JSON и набор HTTP-методов.

Создание RESTful для библиотеки

Предположим, у нас есть JSON-база данных пользователей, имеющих следующих пользователей в файле users.json :

{
   "user1" : {
      "name" : "mahesh",
      "password" : "password1",
      "profession" : "teacher",
      "id": 1
   },
   
   "user2" : {
      "name" : "suresh",
      "password" : "password2",
      "profession" : "librarian",
      "id": 2
   },
   
   "user3" : {
      "name" : "ramesh",
      "password" : "password3",
      "profession" : "clerk",
      "id": 3
   }
}

На основании этой информации мы собираемся предоставить следующие API-интерфейсы RESTful.

Sr.No. URI HTTP метод Тело POST Результат
1 ListUsers ПОЛУЧИТЬ пустой Показать список всех пользователей.
2 Добавить пользователя СООБЩЕНИЕ JSON String Добавить данные нового пользователя.
3 deleteUser УДАЛЯТЬ JSON String Удалить существующего пользователя.
4 :Я бы ПОЛУЧИТЬ пустой Показать детали пользователя.

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

Список пользователей

Давайте реализуем наши первые RESTful API listUsers, используя следующий код в файле server.js:

server.js

var express = require('express');
var app = express();
var fs = require("fs");

app.get('/listUsers', function (req, res) {
   fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
      console.log( data );
      res.end( data );
   });
})

var server = app.listen(8081, function () {
   var host = server.address().address
   var port = server.address().port
   console.log("Example app listening at http://%s:%s", host, port)
})

Теперь попробуйте получить доступ к определенному API, используя URL: http://127.0.0.1:8081/listUsers и метод HTTP: GET на локальном компьютере с использованием любого клиента REST. Это должно привести к следующему результату -

Вы можете изменить данный IP-адрес, когда поместите решение в производственную среду.

{
   "user1" : {
      "name" : "mahesh",
      "password" : "password1",
      "profession" : "teacher",
      "id": 1
   },
   
   "user2" : {
      "name" : "suresh",
      "password" : "password2",
      "profession" : "librarian",
      "id": 2
   },
   
   "user3" : {
      "name" : "ramesh",
      "password" : "password3",
      "profession" : "clerk",
      "id": 3
   }
}

Добавить пользователя

Следующий API покажет вам, как добавить нового пользователя в список. Ниже приводится информация о новом пользователе -

user = {
   "user4" : {
      "name" : "mohit",
      "password" : "password4",
      "profession" : "teacher",
      "id": 4
   }
}

Вы можете принять тот же самый ввод в форме JSON, используя вызов Ajax, но с точки зрения обучения, мы делаем его жестко запрограммированным здесь. Ниже приведен API-интерфейс addUser для нового пользователя в базе данных:

server.js

var express = require('express');
var app = express();
var fs = require("fs");

var user = {
   "user4" : {
      "name" : "mohit",
      "password" : "password4",
      "profession" : "teacher",
      "id": 4
   }
}

app.post('/addUser', function (req, res) {
   // First read existing users.
   fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
      data = JSON.parse( data );
      data["user4"] = user["user4"];
      console.log( data );
      res.end( JSON.stringify(data));
   });
})

var server = app.listen(8081, function () {
   var host = server.address().address
   var port = server.address().port
   console.log("Example app listening at http://%s:%s", host, port)
})

Теперь попробуйте получить доступ к определенному API, используя URL: http://127.0.0.1:8081/addUser и метод HTTP: POST на локальном компьютере с использованием любого клиента REST. Это должно привести к следующему результату -

{
   "user1":{"name":"mahesh","password":"password1","profession":"teacher","id":1},
   "user2":{"name":"suresh","password":"password2","profession":"librarian","id":2},
   "user3":{"name":"ramesh","password":"password3","profession":"clerk","id":3},
   "user4":{"name":"mohit","password":"password4","profession":"teacher","id":4}
}

Показать детали

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

server.js

var express = require('express');
var app = express();
var fs = require("fs");

app.get('/:id', function (req, res) {
   // First read existing users.
   fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
      var users = JSON.parse( data );
      var user = users["user" + req.params.id] 
      console.log( user );
      res.end( JSON.stringify(user));
   });
})

var server = app.listen(8081, function () {
   var host = server.address().address
   var port = server.address().port
   console.log("Example app listening at http://%s:%s", host, port)
})

Теперь попробуйте получить доступ к определенному API, используя URL: http://127.0.0.1:8081/2 и метод HTTP: GET на локальном компьютере, используя любой клиент REST. Это должно привести к следующему результату -

{"name":"suresh","password":"password2","profession":"librarian","id":2}

Удалить пользователя

Этот API очень похож на API addUser, где мы получаем входные данные через req.body, а затем на основе идентификатора пользователя удаляем этого пользователя из базы данных. Для простоты нашей программы мы предполагаем, что собираемся удалить пользователя с ID 2.

server.js

var express = require('express');
var app = express();
var fs = require("fs");

var id = 2;

app.delete('/deleteUser', function (req, res) {
   // First read existing users.
   fs.readFile( __dirname + "/" + "users.json", 'utf8', function (err, data) {
      data = JSON.parse( data );
      delete data["user" + 2];
       
      console.log( data );
      res.end( JSON.stringify(data));
   });
})

var server = app.listen(8081, function () {
   var host = server.address().address
   var port = server.address().port
   console.log("Example app listening at http://%s:%s", host, port)
})

Теперь попробуйте получить доступ к определенному API с помощью URL: http://127.0.0.1:8081/deleteUser и HTTP Method: DELETE на локальном компьютере с использованием любого клиента REST. Это должно привести к следующему результату -

{"user1":{"name":"mahesh","password":"password1","profession":"teacher","id":1},
"user3":{"name":"ramesh","password":"password3","profession":"clerk","id":3}}

Node.js - масштабирующее приложение

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

Дочерние процессы всегда имеют три потока child.stdin , child.stdout и child.stderr, которые могут использоваться совместно с потоками stdio родительского процесса.

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

  • exec - метод child_process.exec запускает команду в оболочке / консоли и буферизует вывод.

  • spawn - child_process.spawn запускает новый процесс с данной командой.

  • fork - метод child_process.fork является частным случаем spawn () для создания дочерних процессов.

exec - метод child_process.exec запускает команду в оболочке / консоли и буферизует вывод.

spawn - child_process.spawn запускает новый процесс с данной командой.

fork - метод child_process.fork является частным случаем spawn () для создания дочерних процессов.

Метод exec ()

Метод child_process.exec запускает команду в оболочке и буферизирует вывод. Имеет следующую подпись -

child_process.exec(command[, options], callback)

параметры

Вот описание используемых параметров -

  • command (String) Команда для запуска с аргументами, разделенными пробелом

  • options (Object) может содержать один или несколько из следующих параметров:

    • cwd (String) Текущий рабочий каталог дочернего процесса

    • env (Object) Пары ключ-значение среды

    • encoding (String) (по умолчанию: 'utf8')

    • shell (String) Оболочка для выполнения команды с (По умолчанию: '/ bin / sh' в UNIX, 'cmd.exe' в Windows. Оболочка должна понимать ключ -c в UNIX или / s / c в Windows. В Windows , синтаксический анализ командной строки должен быть совместим с cmd.exe.)

    • тайм-аут (число) (по умолчанию: 0)

    • maxBuffer (Number) (по умолчанию: 200 * 1024)

    • killSignal (String) (по умолчанию: 'SIGTERM')

    • uid (Number) Устанавливает личность пользователя процесса.

    • gid (Number) Устанавливает групповую идентификацию процесса.

  • callback Функция получает три аргумента error , stdout и stderr, которые вызываются с выводом, когда процесс завершается.

command (String) Команда для запуска с аргументами, разделенными пробелом

options (Object) может содержать один или несколько из следующих параметров:

cwd (String) Текущий рабочий каталог дочернего процесса

env (Object) Пары ключ-значение среды

encoding (String) (по умолчанию: 'utf8')

shell (String) Оболочка для выполнения команды с (По умолчанию: '/ bin / sh' в UNIX, 'cmd.exe' в Windows. Оболочка должна понимать ключ -c в UNIX или / s / c в Windows. В Windows , синтаксический анализ командной строки должен быть совместим с cmd.exe.)

тайм-аут (число) (по умолчанию: 0)

maxBuffer (Number) (по умолчанию: 200 * 1024)

killSignal (String) (по умолчанию: 'SIGTERM')

uid (Number) Устанавливает личность пользователя процесса.

gid (Number) Устанавливает групповую идентификацию процесса.

callback Функция получает три аргумента error , stdout и stderr, которые вызываются с выводом, когда процесс завершается.

Метод exec () возвращает буфер с максимальным размером и ожидает завершения процесса и пытается вернуть все буферизованные данные одновременно.

пример

Давайте создадим два js-файла с именами support.js и master.js -

Файл: support.js

console.log("Child Process " + process.argv[2] + " executed." );

Файл: master.js

const fs = require('fs');
const child_process = require('child_process');

for(var i=0; i<3; i++) {
   var workerProcess = child_process.exec('node support.js '+i,function 
      (error, stdout, stderr) {
      
      if (error) {
         console.log(error.stack);
         console.log('Error code: '+error.code);
         console.log('Signal received: '+error.signal);
      }
      console.log('stdout: ' + stdout);
      console.log('stderr: ' + stderr);
   });

   workerProcess.on('exit', function (code) {
      console.log('Child process exited with exit code '+code);
   });
}

Теперь запустите master.js, чтобы увидеть результат -

$ node master.js

Проверьте вывод. Сервер запущен.

Child process exited with exit code 0
stdout: Child Process 1 executed.

stderr:
Child process exited with exit code 0
stdout: Child Process 0 executed.

stderr:
Child process exited with exit code 0
stdout: Child Process 2 executed.

Метод spawn ()

Метод child_process.spawn запускает новый процесс с заданной командой. Имеет следующую подпись -

child_process.spawn(command[, args][, options])

параметры

Вот описание используемых параметров -

  • command (String) Команда для запуска

  • args (Array) Список строковых аргументов

  • options (Object) может содержать один или несколько из следующих параметров:

    • cwd (String) Текущий рабочий каталог дочернего процесса.

    • env (Object) Пары ключ-значение среды.

    • stdio (Array) String Конфигурация stdio дочернего элемента.

    • customFds (Array) Устаревшие дескрипторы файлов, которые потомки могут использовать для stdio.

    • detached (Boolean) Ребенок будет лидером группы процессов.

    • uid (Number) Устанавливает личность пользователя процесса.

    • gid (Number) Устанавливает групповую идентификацию процесса.

command (String) Команда для запуска

args (Array) Список строковых аргументов

options (Object) может содержать один или несколько из следующих параметров:

cwd (String) Текущий рабочий каталог дочернего процесса.

env (Object) Пары ключ-значение среды.

stdio (Array) String Конфигурация stdio дочернего элемента.

customFds (Array) Устаревшие дескрипторы файлов, которые потомки могут использовать для stdio.

detached (Boolean) Ребенок будет лидером группы процессов.

uid (Number) Устанавливает личность пользователя процесса.

gid (Number) Устанавливает групповую идентификацию процесса.

Метод spawn () возвращает потоки (stdout & stderr), и его следует использовать, когда процесс возвращает объем данных. spawn () начинает получать ответ, как только процесс начинает выполняться.

пример

Создайте два js-файла с именами support.js и master.js -

Файл: support.js

console.log("Child Process " + process.argv[2] + " executed." );

Файл: master.js

const fs = require('fs');
const child_process = require('child_process');
 
for(var i = 0; i<3; i++) {
   var workerProcess = child_process.spawn('node', ['support.js', i]);

   workerProcess.stdout.on('data', function (data) {
      console.log('stdout: ' + data);
   });

   workerProcess.stderr.on('data', function (data) {
      console.log('stderr: ' + data);
   });

   workerProcess.on('close', function (code) {
      console.log('child process exited with code ' + code);
   });
}

Теперь запустите master.js, чтобы увидеть результат -

$ node master.js

Проверьте вывод. Сервер запущен

stdout: Child Process 0 executed.

child process exited with code 0
stdout: Child Process 1 executed.

stdout: Child Process 2 executed.

child process exited with code 0
child process exited with code 0

Метод fork ()

Метод child_process.fork - это особый случай spawn () для создания процессов Node. Имеет следующую подпись -

child_process.fork(modulePath[, args][, options])

параметры

Вот описание используемых параметров -

  • modulePath (String) Модуль для запуска в дочернем.

  • args (Array) Список строковых аргументов

  • options (Object) может содержать один или несколько из следующих параметров:

    • cwd (String) Текущий рабочий каталог дочернего процесса.

    • env (Object) Пары ключ-значение среды.

    • execPath (String) Исполняемый файл, используемый для создания дочернего процесса.

    • execArgv (Array) Список строковых аргументов, передаваемых исполняемому файлу (по умолчанию: process.execArgv).

    • silent (Boolean) Если true, stdin, stdout и stderr дочернего элемента будут переданы по родительскому каналу, в противном случае они будут унаследованы от родительского элемента, см. параметры «pipe» и «наследовать» для stdio функции spawn () для больше деталей (по умолчанию false).

    • uid (Number) Устанавливает личность пользователя процесса.

    • gid (Number) Устанавливает групповую идентификацию процесса.

modulePath (String) Модуль для запуска в дочернем.

args (Array) Список строковых аргументов

options (Object) может содержать один или несколько из следующих параметров:

cwd (String) Текущий рабочий каталог дочернего процесса.

env (Object) Пары ключ-значение среды.

execPath (String) Исполняемый файл, используемый для создания дочернего процесса.

execArgv (Array) Список строковых аргументов, передаваемых исполняемому файлу (по умолчанию: process.execArgv).

silent (Boolean) Если true, stdin, stdout и stderr дочернего элемента будут переданы по родительскому каналу, в противном случае они будут унаследованы от родительского элемента, см. параметры «pipe» и «наследовать» для stdio функции spawn () для больше деталей (по умолчанию false).

uid (Number) Устанавливает личность пользователя процесса.

gid (Number) Устанавливает групповую идентификацию процесса.

Метод fork возвращает объект со встроенным каналом связи в дополнение к наличию всех методов в обычном экземпляре ChildProcess.

пример

Создайте два js-файла с именами support.js и master.js -

Файл: support.js

console.log("Child Process " + process.argv[2] + " executed." );

Файл: master.js

const fs = require('fs');
const child_process = require('child_process');
 
for(var i=0; i<3; i++) {
   var worker_process = child_process.fork("support.js", [i]);	

   worker_process.on('close', function (code) {
      console.log('child process exited with code ' + code);
   });
}

Теперь запустите master.js, чтобы увидеть результат -

$ node master.js

Проверьте вывод. Сервер запущен.

Child Process 0 executed.
Child Process 1 executed.
Child Process 2 executed.
child process exited with code 0
child process exited with code 0
child process exited with code 0

Node.js - Упаковка

JXcore, который является проектом с открытым исходным кодом, представляет уникальную функцию для упаковки и шифрования исходных файлов и других ресурсов в пакеты JX.

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

Установка JXcore

Установка JXcore довольно проста. Здесь мы предоставили пошаговые инструкции по установке JXcore в вашей системе. Следуйте инструкциям ниже

Шаг 1

Загрузите пакет JXcore со страницы https://github.com/jxcore/jxcore в соответствии с вашей операционной системой и архитектурой компьютера. Мы загрузили пакет для Cenots, работающий на 64-битной машине.

$ wget https://s3.amazonaws.com/nodejx/jx_rh64.zip

Шаг 2

Распакуйте загруженный файл jx_rh64.zip и скопируйте двоичный файл jx в / usr / bin или, возможно, в любой другой каталог, в зависимости от настроек вашей системы.

$ unzip jx_rh64.zip
$ cp jx_rh64/jx /usr/bin

Шаг 3

Установите переменную PATH соответствующим образом, чтобы запускать jx из любого места, которое вам нравится.

$ export PATH=$PATH:/usr/bin

Шаг 4

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

$ jx --version
v0.10.32

Упаковка кода

Предположим, у вас есть проект со следующими каталогами, в котором вы сохранили все свои файлы, включая Node.js, основной файл, index.js и все модули, установленные локально.

drwxr-xr-x  2 root root  4096 Nov 13 12:42 images
-rwxr-xr-x  1 root root 30457 Mar  6 12:19 index.htm
-rwxr-xr-x  1 root root 30452 Mar  1 12:54 index.js
drwxr-xr-x 23 root root  4096 Jan 15 03:48 node_modules
drwxr-xr-x  2 root root  4096 Mar 21 06:10 scripts
drwxr-xr-x  2 root root  4096 Feb 15 11:56 style

Чтобы упаковать вышеуказанный проект, вам просто нужно зайти в этот каталог и выполнить следующую команду jx. Предполагая, что index.js является файлом ввода для вашего проекта Node.js -

$ jx package index.js index

Здесь вы могли бы использовать любое другое имя пакета вместо индекса. Мы использовали index, потому что мы хотели сохранить наше основное имя файла как index.jx. Тем не менее, приведенная выше команда упакует все и создаст следующие два файла -

  • index.jxp Это промежуточный файл, который содержит полную информацию о проекте, необходимую для компиляции проекта.

  • index.jx Это двоичный файл с полным пакетом, который готов к отправке на ваш клиент или в производственную среду.

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

index.jx Это двоичный файл с полным пакетом, который готов к отправке на ваш клиент или в производственную среду.

Запуск файла JX

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

$ node index.js command_line_arguments

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

$ jx index.jx command_line_arguments

Чтобы узнать больше о JXcore, вы можете проверить его официальный сайт.