В терминале пользователя серверной операционной системы нужно ввести команду: pm2 start app.js -i max Вместо «app.js» нужно ввести название своего исполняемого процесса приложения NodeJS? В результате такой активации у нас появится возможность запустить один прослушивающий сервер под несколько обработчиков. Например, сервер принимающий HTTP-запросы будет жить на одном IP-адресе и порту, […]
NodeJS
Когда нужны «Воркеры» (Worker threads) в NodeJS? Почему тормозит NodeJS? Лучше спрашивать не «Зачем нужны«, а «Когда нужны» Воркеры. NodeJS — это однопоточная среда. То есть на один процесс приходится один поток. И в какой-то внезапный момент времени этот поток может забиться и перестать быстро работать. Вот ты разработчик. Пишешь, […]
Модуль «pm2-logrotate» может вызывать загрузку процессора для NodeJS приложения более 100 процентов. Из-за этого приложение начинает медленнее работать. Вычисления производятся дольше чем обычно. Если для вас в приоритете работа приложения, а не ведение логов (журналов), тогда модуль «pm2-logrotate» нужно отключить. pm2 uninstall pm2-logrotate При помощи этой команды вы отключите продвинутое […]
В консоли Linux (в терминале) переходим в нужную директорию с файлами приложения, командой «cd«. Вводим команду: npm list jsdom После этого мы сможем увидеть установленную версию нашего npm пакета «jsdom«.
В логах работы NodeJS приложения можно увидеть ошибки, где в качестве сообщения выступает строка «socket hang up«. Дословно на русский язык это можно перевести как «розетка повесить трубку«. Если по простому, то это означает, что мы сами остановили выполнение нашего HTTP-запроса методом destroy(). По какой причине? Причин может быть масса: […]
console.log() неправильно работает? Клиентский console.log() не сильно отличается от серверного. Иногда в логах можно получить неожиданные результаты: console.log('%data%', []) NaNata% Обратите внимание, мы передали два параметра в метод log(). Мы хотели вывести сначала строку, а потом массив. Но вместо вывода двух элементов мы получили одну странную строку на выходе. Что […]
У нас есть NodeJS сервер, с которого мы отправляем запросы на разные сайты сети интернет. Мы получаем полезные данные и публикуем аналитику. В некоторых задачах мы хотим собирать IP-адреса, на которых располагаются ресурсы тех или иных сайтов. Работа с системой доменных имён В NodeJS есть модуль, который отвечает за […]
Есть NodeJS код, который рассылает HTTP-запросы на разные сайты. Код организован в один класс, с кучей разных методов. Один из методов занимается отправкой HTTP-запроса с учётом полученного объекта из базы данных. Его код примерно такой: send_http_request(obj){ let new_http_request; if (obj.url.match(/^https.*/)){ new_http_request = https.request( obj.url, this.gethttpresponse.bind(this, obj) ) } else { […]
Как не дожидаться полного получения HTTP-ответа и всех событий ‘data’, если NodeJS отправил HTTP-запрос в качестве клиента? Ситуация такая. Есть приложение. NodeJS рассылает множество HTTP-запросов на сторонние сайты и извлекает из HTTP-ответов полезную информацию. У нас NodeJS находится в роли клиента, а не сервера. В нашем примере интерес представляют только […]
Предполагаю, что у вас уже установлен сам менеджер процессов PM2 в серверный NodeJS при помощи пакетного менеджера NPM. Сайт пакета PM2 — https://pm2.keymetrics.io npm install pm2 -g Вторым шагом нужно установить в PM2 дополнительный инструмент. Внимание! Именно в PM2. pm2 install pm2-logrotate Модуль «pm2-logrotate» предназначен для автоматической ротации журналов процессов, […]
Чтобы делать скриншоты сайтов при помощи NodeJS, у нас должен быть установлен пакет Puppeteer. Эту установку мы делаем через пакетный менеджер NPM. В операционной системе (например, Debian) должен быть установлен безголовый браузер Google Chrome, при помощи которого Puppeteer ведёт свою работу. Сам код обычного приложения будет выглядеть примерно так: […]
У нас есть NodeJS код, который посылает запрос на сайт. То есть наше NodeJS приложение по сути является клиентом, а не сервером. Проблемы для NodeJS в роли клиента, связанные с долгими ответами сайтов Некоторые сайты могут долго отвечать на HTTP-запросы, которые рассылает NodeJS в роли клиента. Если мы посылаем […]
Работая с таймерами или интервалами в NodeJS можно столкнуться с неожиданной ошибкой падения сервера. В проксирующем веб-сервере nginx на NodeJS-сервер, на клиент может уходить 502 код ошибки HTTP. Причём интересно то, что сам setTimeout() отрабатывает выверенное ему время задержки. На клиент ошибка падает спустя определённую задержку таймера. Эта ошибка формулируется […]
Чтение файла возвращает объекты Буферов (Buffer). Чтобы привести их к строке с человеческими символами нужно воспользоваться вызовом: const fs = require('fs') let my_str; fs.readFile('/var/www/blablabla.file', (err, data) => { if (err) throw err; my_str = data.toString('utf8') }); Выражение «.toString(‘utf8’)» приведёт Буфер к Строке (Buffer to String) В нашем примере предполагается, что […]
Работая с файлами в NodeJS, можно столкнуться с проблемой — полученные массивы с именами файлов из директорий сайта(приложения) могут содержать символы «вопроса в ромбе«. То есть, если у нас файлы на сервере именуются не в латинице, то могут начаться проблемы при переезде сайта в другую систему (на другой хост). Методы […]
На сервере Тестировал примитивное приложение для NodeJS, которое выводит console.log() через связку из создания интревального таймера setInterval() и его отключения clearInterval(). Выглядит оно так: let a = 1; function a5(){ if(a>=5){ console.log(‘a больше или равно 5’, a); clearInterval(x); […]
Предположим мы хотим отключить кластерный режим (Cluster Mode) у приложения app. Как это сделать? Убеждаемся, что нужное нам приложение работает в кластерном режиме, для этого выполняем команду: pm2 list Команда выведет список всех доступных приложений PM2 Теперь нужно последовательно ввести три команды: pm2 stop app.js pm2 delete app.js pm2 […]
Если вы используете менеджер процессов PM2, то логи NodeJS-приложения будут находиться в директории: $HOME/.pm2/logs Если вы вошли под root-пользователем, то лог нужно искать в директории — /root/.pm2/logs Если вы вошли под vasya-пользователем, то лог нужно искать в директории — /vasya/.pm2/logs Внутри будут лежать файлы логов приложений парами: ***-out.log ***-error.log По […]
Большинство клиентских пользовательских приложений общаются с сервером при помощи Запросов. Для передачи данных большого размера с клиента на сервер обычно используется метод POST стандарта HTTP. Иногда наступают такие ситуации, при которых данные не успевают приняться сервером. Из-за этого их дальнейшая обработка будет не корректной и мы можем получить undefined. […]
Внимание!!! Информация актуальна только на дату публикации. Информация может быть устаревшей. Модуль таймера timer предоставляет глобальный API для планирования функций, которые будут вызываться в определенный период времени в будущем. Поскольку функции таймера являются глобальными, нет необходимости вызывать require('node:timers') для использования API. Функции таймера в Node.js реализуют тот же API, что […]
Иногда нужно проверять IP-адрес клиента, с которого был отправлен запрос на наш сервер приложения (сайта). В некоторых случаях это необходимо для блокировки доступа к ресурсу. Например IP-адрес может проявлять негативную активность или как-то нагружать работоспособность сервера. Принудительное добавление в «чёрный список» может временно решить данную проблему. Для вычисления IP-адреса существует […]
Переходим в директорию с проектом, например путь в Debian: cd /var/www/мой_сайт Вызываем команду для создания файла зависимостей: npm install pg Может потребоваться обновление самого пакетного менеджера, например: npm install -g npm@8.11.0 Следуйте подсказке, которую выдаст сам пакетный менеджер npm В директории приложения (сайта) появится два файла: package.json […]
Как отправить запрос на какой-либо сайт из сервера, работающего на NodeJS? Обычно NodeJS создают для того чтобы «ПРИНИМАТЬ ЗАПРОСЫ» и «ОТПРАВЛЯТЬ ОТВЕТЫ». И в таком случае NodeJS работает именно как «СЕРВЕР«. Но в то же время NodeJS может работать и как «КЛИЕНТ«, как обычный пользовательский агент, который сам рассылает запросы […]
Параметр path (путь) Оформляется в виде: <string> или <Buffer> или <URL> Что-то одно на выбор. Параметр options (настройки) Оформляется в виде: <string> или <Object> Что-то одно на выбор. Состав: flags (флаги) <string> Смотрите поддержку флагов файловой системы. По умолчанию: ‘r’. encoding (кодировка) <string> По умолчанию: null fd (дескриптор файла) […]
Функция fs.createReadStream() позволяет очень просто открыть доступный для чтения поток. Всё, что вам нужно сделать, это передать путь к файлу, чтобы начать потоковую передачу. Получается, что объекты ответа (как и запроса) являются потоками. Поэтому мы будем использовать этот факт для создания http-сервера, который передаёт файлы клиенту. Поскольку код достаточно прост, […]
Про базовые модули NodeJS всё понятно. Подключил по названию и готово. А как быть со своими собственными файлами-модулями? Ниже описан один из примеров подключения своего модуля для NodeJS. Шаг 1 — Создаём сам файл-модуль Я просто создам массив внутри файла ttt с расширением .js ["t1", "t2", "t3"] Я […]
Это распространённый метод использования NGINX в качестве прокси-сервера HTTP для PM2. NGINX позволит быстро обслуживать статические файлы, управлять протоколом SSL и перенаправлять трафик в ваше приложение Node.js. Вот пример приложения Node.js, прослушивающего порт 3001, и NGINX, перенаправляющего трафик с порта 443 (HTTPS) на 3001. Этот пример также будет обрабатывать соединения […]
В связке технологий (NGINX, NodeJS, PM2) на сайте стала периодически появляться ошибка 502 bad gateway, которую возвращал веб-сервер NGINX, который работал в режиме «пробрасывающего» запросы сервера на NodeJS-приложение. В логах сервера NGINX эта ошибка была оформлена как «connect() failed (111: Connection refused) while connecting to upstream«. Управление NodeJS-приложениями было доверено […]
Перед чтением какого-либо файла из директории на сервере при помощи NodeJS мы хотим предварительно проверять его существование. Мы хотим получать ИСТИНУ (true) если файл присутствует на сервере или ЛОЖЬ (false) если файла нет. Зачем нужно проверять существование файла на сервере? Если файл не будет существовать на сервере, то это […]
Предполагается, что на сервере мы динамически генерируем файлы с обычным текстовым содержимым и отправляем их на клиент. И однажды может наступить такая ситуация, при которой, например, размер динамического HTML-файла может запросто превысить 5 мегабайт. Это очень много для строки. Проблема заключается в том, что мы не можем заранее знать на […]
Синтаксис ответа response.end([data[, encoding]][, callback]) data <string> | <Buffer> encoding <string> callback <Function> Returns: <this> Этот метод сигнализирует серверу, что все заголовки и тело ответа отправлены; этот сервер должен считать это сообщение завершенным. Метод response.end() ДОЛЖЕН вызываться для каждого ответа. Если данные data указаны, это аналогично вызову response.write(data, encoding), за которым следует response.end(callback). Если указан обратный вызов […]