Справочник по node.js — HackerX https://hackerx.ru Блог о программировании, СУБД, сетях и алгоритмах. Уроки и статьи по разным языкам программирования Wed, 11 Jul 2018 07:15:23 +0000 ru-RU hourly 1 https://wordpress.org/?v=4.9.8 Node.js Child Process — Создание и работа с дочерними процессами в Node https://hackerx.ru/node-js-child-process/ https://hackerx.ru/node-js-child-process/#respond Fri, 18 Aug 2017 12:10:11 +0000 https://hackerx.ru/?p=833 Child Process — это модуль в Node.js, который можно подключить с помощью функции require(). Используя модуль child_process мы можем полноценно использовать функционал процессов. Ниже перечислены некоторые возможности модуля: С помощью модуля child_process мы можем запускать команды shell. Shell — это командный язык высокого уровня, который используется в Unix как интерпретатор. Он совместим с Bash. С помощью простых Shell команд мы можем управлять сервером и написать […]

The post Node.js Child Process — Создание и работа с дочерними процессами в Node appeared first on HackerX.

]]>
Child Process — это модуль в Node.js, который можно подключить с помощью функции require(). Используя модуль child_process мы можем полноценно использовать функционал процессов. Ниже перечислены некоторые возможности модуля:

  • С помощью модуля child_process мы можем запускать команды shell. Shell — это командный язык высокого уровня, который используется в Unix как интерпретатор. Он совместим с Bash. С помощью простых Shell команд мы можем управлять сервером и написать сложные сценарий.
  • Модуль child_process позволяет запускать параллельные дочерние процессы.
  • Модуль child_process позволяет обмениваться сообщениями между собой.

 

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

Метод child_process.exec()

С помощью метода child_process.exec() мы можем запускать команды на выполнения. После выполнения результат будет сохранен в буфере.

Пример использование метода child_process.exec():

const exec = require("child_process").exec;

const child = exec('cat *.js not_exist_file | wc -1', {cwd: '/'}, (err, stdout, stderr) => {
  console.log('stdout: ' + stdout);
  console.log('stderr: ' + stderr);
  if(err){
    console.log('exec error: ' + err);
  }
});

Тут мы с помощью метода child_process.exec() запускаем shell-команду cat, выводящую содержимое нескольких файлов и через пайп передающую их команде wc, считывающей количество строк. Вторым аргументом передается массив параметров в данном случае мы изменяем рабочую директорию. Метод в качестве третьего аргумента принимает функцию, который принимает 3 параметра. Первый параметр — это объект ошибки, а второй и третий — это потоки stdout и stderr. Ценность команды состоит в возможности действий с полученными результатами.

Метод child_process.spawn()

Следующий метод — это child_process.spawn(), который запускает команду в новом процессе, дескриптор которого становится доступным:

const spawn = require("child_process").spawn;
let ls = spawn('ls', ['-lh', '/user']);

ls.stdout.on('data', (data) => {
  console.log("stdout: " + data);
});

ls.stderr.on('data', (data) => {
  console.log("stderr: " + data);
});

ls.on('close', (code) => {
  console.log("child process exited with code: " + data);
});

Здесь все просто — любой вывод исполняемой команды передается в поток stdout дочернего процесса (или stderr, если случилось ошибка), и мы связали обработчики именно с этими объектами. Мы видим, что поток выполняется параллельно с основным процессом и завершается с кодом 0, что свидетельствует об успехе.


Метод child_process.fork()

Следующий метод — это child_process.fork(), который запускает дочерним процессом новый процесс, порожденный самой Node.js. Ниже представлен простой пример работы данного метода:

const sp = require("child_process");

let child1 = cp.fork(`${__dirname}/sub1.js`);
let child2 = cp.fork(`${__dirname}/sub2.js`);

while(cp){
  console.log("running main");
}

Тут мы запускаем два дочерних процесса, исполняющих код, характеризующихся в файлах sub1.js и sub2.js, и создаем бесконечный цикл вывода сообщений. Ниже представлен содержимое дочерних процессов:

sub1.js:

while(1){
  console.log("running: process 1");
}

sub2.js:

while(1){
  console.log("running: process 2");
}

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

Метод child_process.send()

Последний метод, который будет рассмотрен в этом статье — это метод send() модуля Child Process. Он отсылает сообщения от одного процесса к другому:

main.js:

const sp = require("child_process");

let child = cp.fork(`${__dirname}/sub.js`);

child.on("message", (data) => {
  console.log("Main got message: " + data);
});

child.send({'hello': 'child'});

sub.js:

process.on("message", (m) => {
  console.log("Child got message: " + m);
});

process.send({'foo': 'bar'});

В виде сообщение также можно посылать команды управления.

The post Node.js Child Process — Создание и работа с дочерними процессами в Node appeared first on HackerX.

]]>
https://hackerx.ru/node-js-child-process/feed/ 0
Node.js — Процессы. Свойства и методы объекта Process https://hackerx.ru/node-js-process/ https://hackerx.ru/node-js-process/#respond Mon, 14 Aug 2017 14:18:15 +0000 https://hackerx.ru/?p=792 Любое приложение созданное на Node.js — это экземпляр объекта Process, который наследует все свойства и методы этого объекта. С помощью этих свойств и методов мы можем получить информацию о приложении и контексте его исполнения. Ниже представлен пример работы некоторых свойств, назначение которых очевидно из названий. Для использование данного примера, нужно создать .js файл, вводить код примера и запустить файл с терминала (командная строка). […]

The post Node.js — Процессы. Свойства и методы объекта Process appeared first on HackerX.

]]>
Любое приложение созданное на Node.js — это экземпляр объекта Process, который наследует все свойства и методы этого объекта. С помощью этих свойств и методов мы можем получить информацию о приложении и контексте его исполнения. Ниже представлен пример работы некоторых свойств, назначение которых очевидно из названий.

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

console.log(process.execPath);
console.log(process.version);
console.log(process.platform);
console.log(process.arch);
console.log(process.title);
console.log(process.pid);

Если используете операционную систему Windows, то результат может быть примерно такой:

C:\Program Files\nodejs\node.exe
v8.1.4
win32
x64
cmd — node test.js
3712

Еще две важные и часто используемые свойства объекта Process — это process.moduleLoadList и process.argv. С помощью свойство moduleLoadList мы можем получить информацию о загруженных модулях, а с помощью argv мы можем получить весь список команд из командной строки (терминал / cmd).

process.argv возвращает массив аргументов командной строки. Давайте рассмотрим это на примере. Нам нужно создать .js файл с таким содержанием:

console.log( process.argv );

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



Без дополнительных параметров:

node test.js

Результат:

[ ‘C:\\Program Files\\nodejs\\node.exe’,
‘C:\\Users\\Voskan\\Desktop\\primeri\\test.js’ ]

Результатом будет массив параметров командной строки. Всегда первый элемент массива — это имя / адрес исполняемого правления, то есть адрес интерпретатора Node.js, второй параметр — это файл который исполняется.

А сейчас посмотрим пример с доп. параметрами:

node test.js foo bar kuku hello

Результат:

[ ‘C:\\Program Files\\nodejs\\node.exe’,
‘C:\\Users\\Voskan\\Desktop\\primeri\\test.js’,
‘foo’,
‘bar’,
‘kuku’,
‘hello’ ]

Мы видим, что свойство process.argv возвращает все команды / параметры терминала / консоли в виде массива данных.

Следующая команда / метод — это process.exit(), с помощью которого можно завершить / закрыть процесс. Метод в качестве параметра принимает число / статус код. По умолчанию это 0, который означает, что процесс завершен успешно. Чтобы завершить / выйти с ошибкой, нужно передать 1 — process.exit(1).

Код выхода определяется с помощью событие exit:

process.on("exit", (code) => {
  console.log("Процесс завершен с кодом: " + code);
});

Еще один полезный метод — это process.memoryUsage(), который возвращает информацию о потребление памяти процессом Node в байтах. Метод возвращает информацию в виде объекта.

Пример использование метода process.memoryUsage():

console.log( process.memoryUsage() );

let arr = [];

for(let i = 0; i <= 50000; i++){
    arr[i] = "String " + i;
}

console.log( process.memoryUsage() );

Результат:

{ rss: 21565440,
heapTotal: 6291456,
heapUsed: 4411624,
external: 8252 }

{ rss: 27615232,
heapTotal: 16777216,
heapUsed: 8688976,
external: 8252 }

heapTotal и heapUsed характеризуют потребление памяти JavaScript движка V8.

The post Node.js — Процессы. Свойства и методы объекта Process appeared first on HackerX.

]]>
https://hackerx.ru/node-js-process/feed/ 0
Node.js: fs.appendFile( ) — Асинхронное добавление текста в конец файла https://hackerx.ru/node-fs-appendfile/ https://hackerx.ru/node-fs-appendfile/#respond Sun, 13 Aug 2017 15:38:45 +0000 https://hackerx.ru/?p=781 У модуля файловой системы (fs) есть метод appendFile(), который предоставляет возможность асинхронно добавлять / записать текст в конец файла не удаляя содержимое файла. Синтаксис fs.appendFile(файл, данные[, опции], callback) файл <string> | <Buffer> | <number> имя файла или файловый дескриптор данные <string> | <Buffer> опции <Object> | <string> кодирование <string> | <null> Значение по умолчанию: ‘utf8’ mode <integer> Значение […]

The post Node.js: fs.appendFile( ) — Асинхронное добавление текста в конец файла appeared first on HackerX.

]]>
У модуля файловой системы (fs) есть метод appendFile(), который предоставляет возможность асинхронно добавлять / записать текст в конец файла не удаляя содержимое файла.

Синтаксис

fs.appendFile(файл, данные[, опции], callback)

  • файл <string> | <Buffer> | <number> имя файла или файловый дескриптор
  • данные <string> | <Buffer>
  • опции <Object> | <string>
    • кодирование <string> | <null> Значение по умолчанию: ‘utf8’
    • mode <integer> Значение по умолчанию: 0o666
    • флаг <string> Значение по умолчанию: ‘a’
  • callback <Функция>

 

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

Пример использование

const fs = require('fs');

fs.appendFile('message.txt', 'Данные для добавления', 'utf8', (err) => {
  if (err) throw err;
  console.log('Данные были добавлены в конец файла!');
});

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

Все статьи по теме работы с файлами в Node.js

The post Node.js: fs.appendFile( ) — Асинхронное добавление текста в конец файла appeared first on HackerX.

]]>
https://hackerx.ru/node-fs-appendfile/feed/ 0