Автор оригинала: FreeCodeCamp Community Member.
Абхинав Панды
Нет структуры, нет NPM, нет Package.json, без излишеств
В этом посте мы будем Погружать глубоко внутри узлов. Основы Создавая веб-приложение Node.js без внешних пакетов. Мы рассмотрим основные понятия, такие как Потоки, события, исключения, HTTP и т.п.
В настоящее время, когда мы говорим, что мы собираемся реализовать услугу в Node.js, в большинстве случаев мы собираемся использовать Express или другие третий библиотеки для реализации нашей функциональности. И я не собираюсь сказать, что есть какое-либо вред. Эти библиотеки обеспечивают необходимую абстракцию над избыточными концепциями, которые делают нас эффективными.
Но с большей абстракцией низкоуровневая логика вашей программы скрыта от вас. В результате мы не можем разработать четкую картину того, как наша бизнес-логика взаимодействует с Node.js.
Но как Райан Даль, создатель Node.js сказал:
Мы подтолкнуми себя, чтобы сформировать эту ясную картину полностью.
Итак, давайте построим необработанную HTTP Node.js приложение без структуры, без NPM, а не Package.json.
Мы построим приложение, которое будет:
- Импорт необходимо модули
- Создать Экземпляр сервера
- Прикрепить слушателей к Запрос Событие объекта сервера
- Проанал запрос тела и заголовок
- Отправка ответа клиенту.
- Обрабатывать ошибки событий по запросу и реагированию потоков.
Но вот улов;)
Мы сделаем все это с нуля только с
- Терминал, и
- редактор.
Да!! Мы будем использовать никто другой рамки , Никто другой библиотеки просто Сырой JavaScript и ядро Node.js Runtime Wime Отказ
Давай начнем!
Перед созданием HTTP-сервера давайте рассмотрим необходимую концепцию HTTP-модуля в Node.js.
Что такое http?
http
. В Node.js находится встроенный модуль, который позволяет связь-серверную связь через протокол HTTP. Этот модуль предоставляет интерфейс для создания клиента HTTP или HTTP-сервера, который может взаимодействовать с другими HTTP-серверами или клиентами.
И сделать это пространство связи эффективным, http
. Модуль предоставляет потоковое данные с использованием интерфейса потока. И поскольку поток передает данные в кусках, это означает, что Node.js никогда не буферирует весь запрос или ответ сразу в памяти. Мы приедем в Потоки скоро.
Так что для нашего приложения мы будем использовать это http. Интерфейс для создания HTTP-сервера, который будет прослушивать определенный порт и дать данные обратно пользователю.
Импорт модуля HTTP
Использовать либо http
. Сервер или клиент, который вы должны потребовать http
. модуль.
var http = require("http");
Теперь давайте посмотрим, как работает выше линейка:
Для загрузки экземпляра конкретного модуля в наше время выполнения Node.js предоставляет нам A требуется
Переменная, которая является всемирно доступной. Мы используем это глобально определено требуется
Переменная и скажите узел для загрузки http
. Модуль (пройдя 'http'
как только параметр для требуется
Функция Call).
Существует список других объектов Node.js, который вы можете проверить в Node Rep (нажав
Но 2 наиболее важно для нашего использования:
- требуется модуль
- модуль (Углубленное объяснение в следующей статье)
(Нам не нужно требовать («требовать»)
или требуют («модуль»)
поскольку они глобальные).
Как делает требовать работай?
Во время выполнения, когда Node.js вызывает требуется
Вызов (требуется (‘./path/to/filename’), он ищет файл с именем, то же самое, что и что приведено в единственном параметре для требуемого вызова функции.
И как только имя файла совпадает, Node.js проверяет 3 типа расширений:
.js
– Node.js ищет «filename.js» на указанном пути для загрузки в виде скрипта JS..json
– Если Node.js находит файл «filename.json» на указанном пути, он загружает файл с именем, соответствующим значению клавиши «Главная» в файле JSON..node
– Node.js загружает двоичные аддоны с именем filename.node на указанном пути.
Создать экземпляр сервера
Теперь, когда мы включили http
. Модуль, нам нужно создать объект HTTP Web-сервера. Это можно сделать, используя Createserver
Метод на http
. модуль.
К Createserver
Способ, мы передаем функцию обратного вызова, которая называется каждый раз, когда запрос получен на сервере.
Это Createserver
Метод Возвращает объект сервера, который мы храним в переменной приложение
Отказ Этот серверный объект – эмиттер событий.
Хорошо, подожди, что такое Эмиттер событий ?
Давайте немного посмотрим в по имени событие
и Эмиттер
объекты.
Большая часть Node.js Core APIS построена вокруг архитектуры, управляемой событиями. Некоторые виды объектов (под названием «emitters») могут вызвать некоторую функцию («слушатели»), которые будут вызываться, излучающие любые «названные» события.
Давайте увидим пример, чтобы получить это.
Выход: Называется NimedEvent в моих объектах события прилагается слушатель
Объяснение
В приведенном выше примере мы видели Имедунт
Имеет слушатель (функцию) к нему. Прилагается, мы имеем в виду, что слушатель называется после того, как он слышит названный событие. Таким образом, слушатель печатает вывод на экране консоли при воздействии объекта Emitters Имедунт
Отказ
Помимо прикрепления слушателей, Eventemitter
Объект предоставляет многие другие свойства и функции, такие как
- Вы можете получить счет общего количества слушателей, прикрепленных к именованному событию или
- Вы также можете удалить слушатель, прикрепленный к событиям.
Вы можете обратиться к Node.js Официальные документы Для получения более подробной информации о событиях в Node.js.
Вернуться к нашему примеру …
Наш объект веб-сервера также похож на все другие объекты излучателей, внедряющих интерфейсы излучателей событий. Это также излучает различные виды именованных событий.
Некоторые из них следующие:
соединить
– Поднята для всех запросов «Connect» Client HTTP.Соединение
– излучается, когда установлен новый TCP поток. Обеспечить доступ к установленному розетку.Запрос
– Выпускается для каждого запроса от клиента (мы бы слушали здесь).Обновление
– Выпускается каждый раз, когда клиент запрашивает модернизацию протокола (может быть версией HTTP).
Вы можете получить полный список событий, излучаемых нашим веб-сервером из Официальный Node.js doc с.
Прослушивание события запроса
Теперь, поскольку наш сервер должен слушать входящий запрос, мы будем слушать Запрос
Событие нашего HTTP-сервера.
Образец кода:
В 3-й строке функция слушателя прикреплена для прослушивания всех Запрос События на нашем сервере объекта.
Запрос
Событие предоставляет функцию слушателя с 2 параметрами, которые являются:
- Запрос – экземпляр объекта http.incomingmessage и
- ответ – экземпляр объекта http.serverresponse.
Эти Запрос
и ответ
Объекты имеют свойства и методы, которые они наследуют от http.incomingMessage
и http.serverresponse
классы соответственно.
Проанал запрос тела и заголовки
Теперь, когда у нас есть доступ к Запрос
и ответ
объект…
Первые несколько вещей, которые вы можете узнать о входящих запросах, являются URL, метод и заголовки Отказ Node.js делает это очень легко Прикрепление их как свойства к Запрос
Объект (передан как первый параметр для слушателя Запрос
Событие).
Вы можете сделать структуру объекта запроса, чтобы получить их так:
const {заголовки, URL, метод;
Заголовки
прошедший по запросу присутствует как независимый объект внутри Запрос
Объект (секрет: все они в нижнем регистре).
После взгляда на http
. Способ, в случае положения или пост-запроса, мы заинтересованы в поисках данные
отправлено в тело запроса.
Но принимать данные из тело запроса, нам нужно знать несколько ключевых моментов о объекте запроса.
Запрос объекта – читаемый поток
Запрос
Объект, который передается в обработчик, также реализует интерфейс для читаемого потока. Это означает, что наше Запрос
Объект – это поток, который может быть слушал или трубопровод в другом месте, чтобы схватить данные, которые теряют в него. Мы также возьмем данные прямо из Запрос
поток, слушая поток данные
и конец
События.
Различные виды данных могут быть переданы на наш сервер, но, чтобы держать его простым, мы будем передавать только строку в организме.
Чтобы использовать эти данные, нам нужно Разбор это, поэтому мы будем использовать данные
и конец
событие читабельного потока, который реализуется нашим Запрос
объект, как упоминалось ранее.
На каждом данные
Событие, Читаемый поток передает данные как буферный кусок. Мы будем добавлять все куски в пустой массиве. И в конец
Мероприятие мы будем объединить и строить массив чтобы получить кумулятивное тело.
Так вот код до сих пор до сих пор:
Отправка ответа на клиента.
После сбора данных из HTTP-запроса нам нужно дать соответствующий ответ клиенту. Но так как Запрос
Объект реализует только читаемый поток, Нам нужен писнутый поток, где мы можем выписать наш ответ.
Объект ответа – пирентный поток
Для этого Node.js предоставляет нам 2-й параметр, который является ответ
объект к Запрос
Слушатель событий.
Используя ответ
Объект, мы можем установить код состояния HTTP, установить заголовки и записывать содержимое в потоке записи объекта ответа.
Хотя, если вы не установите код ответа явно, то сам Node.js устанавливает его до 200. Но в качестве сложности увеличивается, вы захотите установить желаемое СТАТУС КОДЫ
от ответа HTTP.
Неявные заголовки настройки
Вы можете Установить, получить и Удалить Заголовки к ответу, используя SetHeader (имя, значение)
, getheader (имя)
и RemoveHeader (Имя)
API.
Образец кода:
При использовании вышеуказанного setheader ()
Метод настройки заголовков, мы в зависимости от Node.js до неявно Установите заголовки ответа перед отправкой органа ответа.
К Установить заголовки и код состояния явно, У нас есть Ответ.writehead ()
метод.
Образец кода:
В то время как явно устанавливая заголовки, мы должны помнить, что Заголовки приходят перед телом в HTTP-ответе Отказ То есть мы должны предпочесть использовать Нарисование ()
метод, прежде чем писать что-либо до тело ответа.
Теперь давайте посмотрим, как мы можем написать данные в ответ.
Поскольку объект ответа является объектом записи повторного потока, нам просто нужно использовать Написать поток Методы для записи кусков данных в объект отклика HTTP.
Образец кода:
После записи в поток ответа нам нужно Закрыть поток Так что у Node.js узнают, что пришло время отправить ответ обратно на клиента.
.end ()
Метод позволяет нам Закрыть Http . Соединение Это было настроено во время запроса, находящегося на нашем сервере. конец ()
Метод также принимает последнюю строку, которая должна быть написана перед закрытием соединения.
Если мы не будем использовать конечный метод, Node.js напишет данные в поток записи и подождите …
… до по умолчанию Тайм-аут на сервере объект истекает. То есть для любого запроса Node.js только ждет фиксированное время (который указан в объекте сервера) перед закрытием связи Отказ И как только соединение закрыто (либо вручную, используя End ()
или время ожидания времени), Узел освобождает все выделенные ресурсы сразу Отказ
Вы можете установить или изменить тайм-аут, используя server.settimeout ([msecs] [, обратный вызов])
Отказ
Чтобы отключить тайм-аут, вы можете установить значение TimeOut значение 0. Но поскольку время ожидания присвоения во время формирования нового соединения, Тайм-аут будет обновлен только для предстоящих новых подключений Отказ
Теперь, когда мы написали наш ответ, наш сервер должен работать нормально.
Но что произойдет, когда наш сервер столкнулся с исключением?
Нам нужно услышать Ошибка
. События Запрос
и ответ
потоки. Ошибка
. Мероприятие поднимается каждый раз, когда происходит исключение. Вы можете попытаться избежать этого, но они приходят, и мы должны поймать и обращаться с ними должным образом.
Но как?
Мы справимся с ними Прикрепляя обработчики ошибок к Ошибка
. События Запрос
и ответ
потоки.
Объяснение
Здесь мы ловим все Ошибка
. События Запрос
и ответ
ручьи и просто войдите в систему в консоль. Вы также можете использовать Util
вместо Консоль
В производственной среде (хотя в производстве он рекомендуется правильно проверять ошибки).
Теперь давайте посмотрим на образец кода, мы довели до этого.
Итак, наш сервер способен на следующие вещи на данный момент:
- Импорт необходимо модули
- Создать Экземпляр сервера
- Прикрепить слушателей к Запрос Событие объекта сервера
- Проанал запрос тела и заголовок
- Напишите ответ к потоку ответа
- Обрабатывать ошибки событий по запросу и реагированию потоков.
К настоящему времени мы сделали наш серверный объект, способный принять голову на новые соединения, но мы не сказали, где слушать новые связи. То есть этот объект Server также должен быть связан с определенным портом, чтобы наш сервер мог иметь доступ ко всем входящим запросам в этом порту.
Для этого мы будем использовать .Listen
Способ нашего объекта HTTP Server, .Listen (порт, CB).
@params Port – это номер порта, в котором мы хотим, чтобы наш сервер слушать.
@Params Callback называется, как только сервер запускает прослушивание.
Образец кода:
К настоящему времени наш сервер готов получить запросы.
Давайте запустим наше приложение Node.js:
node app.js
И ударить наш сервер с помощью следующего Curl на терминале:
curl -d "Hello World" -H "Content-Type: text" -X POST http://localhost:8008
Woohoo !! Поздравляем, вы создали приложение Node.js без внешних пакетов.
Удивительно аплодировано, что вы остались долго.
Если вы готовы узнать больше о Node.js Core, как это, то дайте мне знать, разрывая хлопья, подсчитывает до 50.
В следующих статьях мы будем продолжать строить над этим базовым приложением и добавлять другие критические особенности Маршрутизация, промежуточное программное обеспечение, обработка ошибок И т.д. Получить уведомление, следуя за мной здесь на среднем.
Я пытался сделать эту статью как можно более полной. Если у вас есть идеи, которые могли бы сделать его лучше, пожалуйста, упомяните в ваших ценных комментариях.
Вы можете подключить меня через Gmail или твитнуть мне здесь Отказ
Большое спасибо за вашу любовь! Простите мои ошибки, вы были замечательной аудиторией.