Айо Исаия
Одной из причин, по которым Node.js такая отличная платформа для строительных приложений – это обилие библиотек, которые были разработаны сообществом практически на все общие случаи использования. Это делает его действительно легко отправиться от идеи к приложению к производству в относительно короткой промежутке времени.
Тем не менее, по крайней мере, понимание стандартных библиотек Node.js всегда будет вам полезным, особенно если вы хотите получить более глубокое понимание того, как работает Node.js.
В этой статье вы узнаете, как построить Timestamp Microvery Используя несколько встроенных модулей Node.js. Вот a Живая демонстрация из того, что мы будем строить. Вы можете найти полный исходный код для этого проекта в этом Github repo Отказ
Предварительные условия
Вам необходимо иметь предыдущий опыт работы с приложениями JavaScript в браузере, но не требуется предыдущий опыт работы с Node.js. Прежде чем вы продолжите, когда вы должны иметь Node.js и NPM установлены.
Вы можете посетить Node.js сайт Для просмотра инструкций по установке для вашей операционной системы. NPM Поставляется в комплекте с узлом, поэтому, как только вы устанавливаете узел, у вас будет доступ к NPM Команда тоже.
Версии, которые я использовал во время создания этого проекта, заключается в следующем:
- Node.js v10.9.0
- NPM V6.4.1
Вы можете просмотреть версию узла и NPM Вы установили, запустив следующие команды в вашем терминале:
node -vnpm -v
Истории пользователей
Вот истории пользователей для этого проекта:
- Конечная точка API –
Get [Project_URL]/API/Timestamp/: Date_String? - Строка даты действительна, если она может быть успешно проанализирована
Новая дата (Date_String). Обратите внимание, что Timestamp Unix должен быть целым числом (не строкой), указав миллисекунды. В нашем тесте мы будем использовать дату строки, совместимые с ISO-8601 (например, «2016-11-20»), потому что это обеспечит TOUTC Timestamp. - Если строка даты пуста, она должна быть эквивалентна триггеру
Новая дата ()I.E. Служба использует текущий меток времени. - Если строка даты действительна, API возвращает JSON, имеющий структуру
{"Unix":, "UTC": кольцо () >} E.g. {«UNIX»: 1479663089000, «UTC»: «Солнце, 20 ноября 2016 17: 31: 29 GMT»}. - Если строка даты недействительна, API возвращает JSON, имеющий структуру
{«Ошибка»: «Неверная дата»}Отказ
Начиная
Откройте новый экземпляр терминала на вашем компьютере, затем создайте новый каталог для этого проекта в своей файловой системе, и измените его, используя следующие команды:
mkdir timestamp-microservicecd timestamp-microservice
Первый шаг при запуске нового проекта узла – это инициализировать его с помощью package.json файл. Этот файл содержит некоторую информацию о проекте, включая его имя, описание, автор и все пакеты, на которых оно зависит. Вот команда, которая помогает вам создать package.json Файл для вашего проекта:
npm init
Запуск вышеуказанной команды открывает подсказку, которая позволяет вводить информацию для определенных частей вашего проекта в следующем порядке:
- Название проекта.
- Первоначальная версия проекта.
- Описание проекта.
- Входной файл проекта.
- Команда тестирования проекта.
- Репозиторий Git для проекта,
- Ключевые слова, связанные с проектом.
- Проектная лицензия.
Если вы удовлетворены предположением, что команда обеспечивает рядом каждое поле (в скобках), просто нажмите клавишу Enter, чтобы принять его и перейти к следующему полю, пока не выходит команда. Вы также можете использовать NPM init -y Чтобы быстро заполнить package.json Файл со всеми значениями по умолчанию.
Следующий шаг – создать index.js Файл в корне своего каталога проекта. Вот где мы будем писать код для этого проекта.
touch index.js
Наконец, создать Виды Папка в корне вашего каталога проекта. Эта папка будет содержать два файла HTML: index.html и 404.html Отказ
mkdir viewstouch views/index.html views/404.html
Откройте папку Project в вашем любимом текстовом редакторе. Теперь мы можем начать строить приложение.
Создайте HTTP-сервер
Откройте index.js и введите следующий код в него:
const http = require("http");const requestHandler = (req, res) => { console.log(req.url); res.end('Hello world!');};const server = http.createServer(requestHandler);
server.listen(process.env.PORT || 4100, err => { if (err) throw err;console.log(`Server running on PORT ${server.address().port}`);});Первая строка требует http . Модуль, который отправляется с узлом и делает его доступным через http . Переменная. Тогда мы используем Createserver Метод на модуле HTTP для создания нового экземпляра HTTP-сервера, который затем сохраняется в Сервер Переменная.
Обратите внимание на RequestHandler Функция, созданная под http . Переменная. Эта функция будет вызываться при каждом входящем запросе на веб-сервер. преодолевать и res Аргументы – это объекты, которые представляют собой запрос от клиентского и серверного ответа соответственно.
Слушать Метод запускает сервер и делает его прослушиванием входящих соединений на Порт Экологическая переменная (доступна на Process.env объект) или 4100 Если там ничего нет. Функция обратного вызова передана на Слушать Метод будет выполняться при запуске сервера. Если приведенный порт уже предпринят, или сервер не может начать по какой-либо другой причине, ошибка брошена. В противном случае console.log () Заявление напечатано в терминале.
Вы можете запустить сервер, запустив Узел index.js в терминале. Как только ваш сервер работает, посетите http://localhost: 4100 в вашем браузере. Вы должны увидеть слова «Hello World!».
Создайте корневой маршрут
С http . Модуль очень простой, он не предоставляет нам маршрутизатор. Поэтому мы должны вручную проверить URL-адрес, чтобы решить, что делать для каждого маршрута. Мы хотим предоставить инструкции о том, как использовать Timestamp Microsvice, как только корневой маршрут пострадал так же, как в демо.
Мы можем сделать это, изменяя RequestHandler Функция такая:
const requestHandler = (req, res) => { if (req.url === "/") { // Do something }};Простой Если Заявление может помочь нам проверить, является ли URL-адрес входящего запроса именно / И тогда мы можем поставить логику для этого маршрута между фигурными брекетами. В этом случае мы хотим вернуть HTML, объяснив, как работает микросервис. Прежде чем продолжить, скопировать и вставить следующее в Просмотров/index.html Файл, который мы создали ранее и сохраните файл.
Timestamp Microservice API Project: Timestamp Microservice
User Stories:
Example Output:
{"unix":1451001600000, "utc":"Fri, 25 Dec 2015 00:00:00 GMT"}
Итак, как мы отправляем HTML-ответ на браузер? Мы можем использовать встроенный ФС Модуль, чтобы прочитать файл, а затем отправить содержимое файла в браузер, используя res Аргумент, который представляет собой ответ сервера.
Требуют ФС Модуль чуть ниже http . один, как показано ниже:
const http = require("http");const fs = require("fs");Затем измените RequestHandler Функция, чтобы выглядеть так:
const requestHandler = (req, res) => { if (req.url === "/") { fs.readFile("views/index.html", "utf8", (err, html) => { if (err) throw err;res.writeHead(200, { "Content-Type": "text/html" }); res.end(html); }); }}; readfile () Метод асинхронно читает файл, предусмотренный в первом аргументе ( Views/index.html ) с использованием прилагаемой кодировки ( utf8 ) и выполняет прилагаемую функцию обратного вызова. Если возникает ошибка при чтении файла, исключение брошено. В противном случае содержимое файла становится доступным во втором аргументе функции обратного вызова ( HTML ) в этом случае.
Теперь мы можем отправить содержимое HTML в браузер. Но нам нужно установить HTTP-код ответа А также установите заголовок ответа, чтобы сообщить браузеру, что на самом деле имеет тип носителя возвращенного контента.
Нарисование () Метод на объекте ответа сервера используется в этом случае. Он принимает код состояния в качестве первого аргумента и объект, представляющий заголовки ответа как второй. Мы установили Content-Type Заголовок к Текст/HTML Чтобы гарантировать, что браузер интерпретирует содержимое нашего ответа в качестве HTML.
Далее конец () Метод отправляет содержимое index.html Файл в браузер в телу ответа и сигнализирует конец ответа сервера.
Чтобы попробовать новые дополнения к коду, вам нужно остановить сервер с Ctrl-C и начать его снова, используя Node Server.js Затем обновите свой браузер. Вы должны увидеть HTML из Просмотров/index.html Файл на странице.
Настройте Nodemon для автоматического перезапуска Процесс узла
По умолчанию вы должны убить процесс сервера и перезапустить его всякий раз, когда вы делаете изменение в свой код, но вокруг этого есть простой способ.
Вам нужно установить инструмент под названием Номемон Какой AUTO перезапускает процесс узла всякий раз, когда ваш код меняется. Вы можете установить этот инструмент глобально на машине с NPM :
npm install -g nodemon
Как только Nodemon установлен, убьйте процесс сервера и начните его снова с odemon index.js Отказ Теперь веб-сервер будет автоматически перезапущен всякий раз, когда вы делаете изменения в своем коде. Довольно аккуратно да?
Следующим шагом является создание маршрута для Microubervice Timestamp. Согласно пользовательской истории № 1, эта услуга должна быть доступен под /API/Timestamp/: Date_String? где : date_string? Представляет строку даты, которая будет передана на службу.
Изменить свой index.js Файл так, чтобы он выглядел так:
// require statements
const getTimestamp = date => ({ unix: date.getTime(), utc: date.toUTCString()});const requestHandler = (req, res) => { if (req.url === "/") { fs.readFile("views/index.html", (err, html) => { if (err) throw err;res.writeHead(200, { "Content-Type": "text/html" }); res.end(html); }); } else if (req.url.startsWith("/api/timestamp")) { const dateString = req.url.split("/api/timestamp/")[1]; let timestamp;if (dateString === undefined || dateString.trim() === "") { timestamp = getTimestamp(new Date()); } else { const date = !isNaN(dateString) ? new Date(parseInt(dateString)) : new Date(dateString);if (!isNaN(date.getTime())) { timestamp = getTimestamp(date); } else { timestamp = { error: "invalid date" }; } }res.writeHead(200, { "Content-Type": "application/json" }); res.end(JSON.stringify(timestamp)); }};// rest of the file
Я знаю, что это много кода, чтобы обработать, так что позвольте мне пройтись через это немного бит. У нас есть еще если Заявление в RequestHandler это проверяет, начинается ли URL запроса с /api/timestamp . Если так, мы Сплит Запрос URL на два и захватывает Datestring расставит полученный массив.
Если Datestring это undefined Или пустая строка, это означает, что ни одна строка даты не была предоставлена в запросе. Пользовательская история № 3 диктует, что мы относимся к этой ситуации, как если бы спросила текущая дата, и это то, что GetTimestamp (Новая дата ()) делает.
Если Datestring Существует, нам необходимо проверить, является ли это временная метка UNIX или строка даты ISO-8601 (например, «2018-11-22»), чтобы мы могли решить, передавать ли номер или строку в Новая дата () Отказ Обратите внимание, что если вы пройдете временную точку Unix как строку в Новая дата () , вы получите неверный результат. Вот почему этот шаг нужен.
Далее мы проверяем, хранятся ли объект даты в Дата Переменная действительна. Если это так, мы получаем объект Timestamp, как и раньше, в противном случае мы устанавливаем Timestamp Переменная к структуре для недействительных дат, как указано в пользовательской истории № 5.
Последний шаг - отправить содержимое Timestamp Переменная к браузеру. В этом случае мы устанавливаем Content-Type Заголовок к Приложение/JSON. так что тело ответа правильно интерпретируется как JSON. Мы также убедимся, что мы отправляем действительное значение JSON, позвонив JSON.Stringify (Timestamp) и прохождение вывода на конец метод.
Теперь проверим приложение, передавая действительную строку даты или метки UNIX после /API/Timestamp/ Или оставьте строку даты, чтобы получить ответ JSON на текущую дату. Вы также можете попробовать пройти неверную строку даты, чтобы подтвердить, что сервис распознает ее как неверную дату.
Реализовать страницу 404
Мы завершили все истории пользователей для этого приложения, но есть одна окончательная вещь, которую я хотел бы сделать. Если браузер запросит URL, который не / или начинается с /api/timestamp , мы должны настроить сервер, чтобы отправить 404 ответ на браузер.
Во-первых, заполнить Просмотров/404.html Файл со следующим кодом:
404 Not found undefined is, unfortunately, not a function
You just 404'd. Maybe you should head back to the homepage.
Далее, измените RequestHandler Функция в index.js Так что это выглядит так:
const requestHandler = (req, res) => { if (req.url === "/") { fs.readFile("views/index.html", (err, html) => { if (err) throw err;res.writeHead(200, { "Content-Type": "text/html" }); res.end(html); }); } else if (req.url.startsWith("/api/timestamp")) { const dateString = req.url.split("/api/timestamp/")[1]; let timestamp;if (dateString === undefined || dateString.trim() === "") { timestamp = getTimestamp(new Date()); } else { const date = !isNaN(dateString) ? new Date(parseInt(dateString)) : new Date(dateString);if (!isNaN(date.getTime())) { timestamp = getTimestamp(date); } else { timestamp = { error: "invalid date" }; } }res.writeHead(200, { "Content-Type": "application/json" }); res.end(JSON.stringify(timestamp)); } else { fs.readFile("views/404.html", (err, html) => { if (err) throw err;res.writeHead(404, { "Content-Type": "text/html" }); res.end(html); }); }};Я добавил окончательный еще Блок в конце RequestHandler Функция, которая читает содержимое Просмотров/404.html Файл и отправляет его в браузер для любого URL, который не соответствует / или /API/Timestamp/: Date_String? .
Попробуй это. Введите URL, как http://localhost: 4100/foo В вашем браузере и подтвердите, что он работает!
Развертывание Героку
Что хорошего - это микроэтам, если никто не может использовать его? Давайте поделимся этим с миром, развернув его на Heroku Отказ
Первый шаг - Подпишитесь на бесплатный аккаунт Heroku . Как только ваш аккаунт активирован, Следуйте по этой ссылке создать новое приложение. Дайте ему уникальное имя. Я позвонил шахту "Ayo-timestamm".
Как только ваше приложение создано, Следуйте инструкциям здесь Чтобы установить Heroku CLI на вашу машину. Затем запустите Heroku Login Команда в терминале, чтобы войти в свою учетную запись Heroku.
Убедитесь, что вы инициализировали репозиторий Git для вашего проекта. Если нет, запустите Git init Команда в корневом каталоге вашего проекта, затем запустите команду ниже, чтобы установить Heroku в качестве пульта дистанционного управления для вашего GIT REPO. Заменить <приложение NA Меня> с именем вашего приложения.
heroku git:remote -a
Далее создайте Procfile В корне своего каталога проекта ( Touch Procfile ) и вставьте в следующем содержании:
web: node index.js
Далее укажите версию узла, который вы работаете в своем package.json Файл под Двигатели ключ. Я конкретно версия 10.9.0 Поскольку это версия, я работаю на моем компьютере. Вы должны изменить это значение, чтобы соответствовать версии узла, который у вас есть на вашем компьютере.
{ "name": "timestamp-microservice", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "Ayo Isaiah", "license": "MIT", "engines": { "node": "10.9.0" }}Наконец, зафиксируйте свой код и подтолкните его к Remote Heroku, используя следующие команды:
git add .git commit -m "Initial commit"git push heroku master
Как только процесс развертывания сделан, вы можете открыть https:// Ku.com Для просмотра и проверки вашего проекта.
Заворачивать
Мы успешно построили Microvice Timestamp, используя только встроенные узловые модули и развернули его к Heroku. Быть уверенным, используя веб-каркасы, такие как Экспресс Легче и практичнее для нетривиальных приложений, но вы были бы гораздо лучшим разработчиком узла, если вы хотя бы немного знакомы со своей стандартной библиотекой, прежде чем проверить то, что должно предложить сообщество.
У меня есть другой учебник, который охватывает Строительство сайта Node.js Использование Express как веб-сервер и Мопс для шаблонов. Вы можете проверить это, если вы хотите больше практики с проектами здания узла и Подписаться на мою рассылку Чтобы получить уведомление, когда я публикую новые учебники.
Первоначально опубликовано freshman.tech 22 ноября 2018 года.
Оригинал: "https://www.freecodecamp.org/news/microservice-8edfdb9be811/"