Node.js — это среда выполнения JavaScript с открытым исходным кодом, построенная на движке Chrome v8, которая позволяет запускать код JavaScript вне браузера.
Его модель событий, экосистема и скорость сделали Node.js одной из самых востребованных и используемых сред выполнения для серверных приложений.
Большинство серверов API Node.js используют Express или другую платформу. Однако вы также можете создать простой API Node.js без фреймворка всего за несколько шагов.
Шаг 1. Настройка среды разработки
Создайте каталог проекта и CD в него, запустив:
mkdir nodejs-api
CD nodejs-апи
Далее инициализируйте нпм в вашем проекте, запустив:
инициализация npm -y
Этот CRUD API будет включать использование MongoDB, базы данных NoSQL, и ее популярного ODM, mongoose.
Выполните следующую команду для установки мангуста:
нпм установить мангуста
Далее создайте сервер.js файл в корневом каталоге вашего проекта и добавьте блок кода ниже, чтобы создать сервер:
константа http = требовать("http");
константа server = http.createServer((req, res) => {});
server.listen (3000, () => {
приставка.журнал(`Сервер работает`);
});
Этот блок кода импортирует модуль http, основной модуль Node.js. Модуль http позволяет Node.js передавать данные по HTTP. Этот модуль содержит методы, необходимые для создания сервера.
Затем он вызывает модуль http создать сервер метод, который создает и возвращает экземпляр сервера. создать сервер метод принимает функцию обратного вызова с объектом запроса и ответа в качестве параметров.
Далее код вызывает Слушать метод на возвращенном экземпляре сервера. Это позволяет серверу начать прослушивание трафика на данном порту. Слушать метод запускает обратный вызов — второй аргумент — в случае успеха.
Наконец, создайте два каталога с именем маршруты а также модели в корневом каталоге вашего проекта. маршруты папка будет содержать логику маршрутизации для вашего API, а модель будет содержать все, что связано с базой данных.
Шаг 2. Подключение вашего приложения к базе данных
В сервер.js, импорт мангуста:
константа мангуст = требовать("мангуста");
Позвоните соединять метод на мангуста и передайте свой URI MongoDB в качестве аргумента:
мангуст.подключить("MongoDB_URI")
Шаг 3: Создание модели API
Создайте CRUD API для простого приложения для блога. В твоей модели папку, создайте blogModel.js файл и добавьте в него следующий код:
константа мангуст = требовать("мангуста");
константа blogSchema = мангуст. Схема({
заглавие: {
тип: Нить,
требуется: [правда, "Блог должен иметь заголовок"],
},
тело: {
тип: Нить,
требуется: [правда, "Блог должен иметь тело"],
},
});
модуль.экспорт = mongoose.model("Блог", blogSchema);
Приведенный выше блок кода создает модель мангуста с двумя свойствами и сопоставляет их с базой данных MongoDB.
Оба свойства в этой модели имеют Нить введите с требуется установлен в истинный. Сопутствующие сообщения об ошибках будут отображаться, если тело запроса не содержит ни одного из свойств.
Последняя строка создает и экспортирует модель мангуста, вызывая метод модель метод на мангуста. Передайте название модели (Блог) в качестве первого аргумента и схемы (блогСхема) в качестве второго аргумента.
Шаг 4: Реализация маршрутизации в вашем приложении
Без помощи такие фреймворки, как Express, вам придется вручную создавать логику для обработки каждого запроса к вашему API.
Сначала создайте blogRoutes.js файл в вашем маршруты папку, затем импортируйте модель блога:
константа Блог = требовать("../модели/модель блога");
Далее создайте асинхронный маршрутизатор функция, пропуск запрос а также разрешение в качестве параметров и экспортируйте функцию:
константа маршрутизатор = асинхронныйфункция (запрос, разрешение) {};
модуль.экспорт = маршрутизатор;
Эта функция будет содержать всю вашу логику маршрутизации.
Далее вы реализуете логику маршрутизации маршрут за маршрутом.
ПОЛУЧИТЬ маршруты
Добавьте приведенный ниже блок кода в свой маршрутизатор функцию для реализации ПОЛУЧИТЬ обработчик маршрутов для запросов к /api/blogs:
// ПОЛУЧИТЬ: /api/блоги
если (треб.URL "/api/blogs"&& требуемый метод "ПОЛУЧИТЬ") {
// получить все блоги
константа блоги = Ждите Блог.найти();// установлен в статус код а такжесодержание-тип
res.writeHead (200, { "Тип содержимого": "приложение/json" });
// отправляем данные
разрешение.конец(JSON.stringify(блоги));
}
Блок кода выше проверяет URL а также метод свойства объекта запроса. Затем он извлекает все блоги из базы данных через найти метод на модели мангуста (Блог).
Далее вызывается писатьголова метод на разрешение, объект ответа. Этот метод отправляет заголовок ответа с тремя аргументами: код состояния, необязательное сообщение о состоянии и заголовки. 200 код состояния представляет собой успешный ответ, а тип содержимого для этого вызова API установлен на приложение/json.
Наконец, закройте запрос, чтобы убедиться, что сервер не зависает, вызвав конец метод на разрешение. Призыв к JSON.stringify преобразует блоги объект в строку JSON и передать ее в конец метод возвращает его как тело ответа.
Добавьте приведенный ниже блок кода в свой маршрутизатор функцию для реализации ПОЛУЧИТЬ обработчик маршрута для одного ресурса:
// ПОЛУЧИТЬ: /api/блоги/:id
если (req.url.match(/\\/api\\/блоги\\/([0-9]+)/) && требуемый метод "ПОЛУЧИТЬ") {
пытаться {
// извлечь идентификатор из URL
постоянный идентификатор = req.url.split ("/")[3];// получаем блог из БД
константа блог = Ждите Блог.findById (идентификатор);
если (блог) {
res.writeHead (200, { "Тип содержимого": "приложение/json" });
разрешение.конец(JSON.stringify(блог));
} еще {
бросатьновыйОшибка("Блог не существует");
}
} ловить (ошибка) {
res.writeHead (404, { "Тип содержимого": "приложение/json" });
разрешение.конец(JSON.stringify({ сообщение: ошибка }));
}
}
Этот код использует соответствие метод, который принимает выражение регулярного выражения в качестве аргумента, чтобы проверить, соответствует ли URL-адрес формату: /api/blogs/.
Далее извлеките я бы имущество от URL строку, вызвав ее расколоть метод. Этот метод принимает шаблон в качестве аргумента (/), разбивает строку на основе шаблона и возвращает массив. Третий элемент этого массива — это я бы.
Наконец, извлеките документ с соответствующим я бы из вашей базы данных. Если он существует, пришлите код ответа 200, закройте запрос и отправьте полученный блог. Если он не существует, сгенерируйте ошибку и отправьте ее в качестве ответа в блоке catch.
Почтовый маршрут
Добавьте приведенный ниже блок кода в функцию маршрутизатора, чтобы реализовать ПОЧТА обработчик маршрута:
// ОТПРАВКА: /api/блоги/
если (треб.URL "/api/blogs"&& требуемый метод "ПОЧТА") {
пытаться {
пусть тело = "";// Слушаем событие данных
треб.на("данные", (кусок) => {
тело += chunk.toString();
});// Слушай конецмероприятие
треб.на("конец", асинхронный () => {
// Создать блог
позволять блог = новый Блог(JSON.parse (тело));
// Сохраняем в БД
Ждите блог.сохранить();
res.writeHead (200, { "Тип содержимого": "приложение/json" });
разрешение.конец(JSON.stringify(блог));
});
} ловить (ошибка) {
приставка.лог (ошибка);
}
}
Объект запроса реализует Node.js ReadableStream интерфейс. Этот поток испускает данные и конец событие, которое дает вам доступ к данным из тела запроса.
Этот код прослушивает событие данных и обрабатывает его, преобразовывая его в строку и объединяя его с тело переменная. в конец обработчик событий, он создает Блог экземпляр с проанализированной строкой тела. Затем он сохраняет новый блог, отправляет код состояния и заголовок содержимого и закрывает запрос.
ПОЛОЖИТЬ маршрут
Добавьте приведенный ниже блок кода в функцию маршрутизатора, чтобы реализовать ПОМЕЩАТЬ обработчик маршрута:
// ВСТАВИТЬ: /api/блоги/:идентификатор
если (req.url.match(/\\/api\\/блоги\\/([0-9]+)/) && требуемый метод "ПОМЕЩАТЬ") {
пытаться {
// извлечь идентификатор из URL
постоянный идентификатор = req.url.split ("/")[3];
пусть тело = "";треб.на("данные", (кусок) => {
тело += chunk.toString();
});
треб.на("конец", асинхронный () => {
// Найти и Обновитьдокумент
позволять обновленный блог = Ждите Blog.findByIdAndUpdate (идентификатор, JSON.parse (тело), {
новый: истинный,
});
res.writeHead (200, { "Тип содержимого": "приложение/json" });
разрешение.конец(JSON.stringify(обновленБлог));
});
} ловить (ошибка) {
приставка.лог (ошибка);
}
}
Обработчик запроса PUT почти идентичен ПОЧТА обработчик запроса, за исключением того, что он извлекает я бы имущество от URL обновить соответствующий блог.
УДАЛИТЬ Маршрут
Добавьте приведенный ниже блок кода в функцию маршрутизатора, чтобы реализовать УДАЛИТЬ обработчик маршрута:
// УДАЛИТЬ: /апи/блоги/:я бы
если (req.url.match(/\\/api\\/блоги\\/([0-9]+)/) && требуемый метод "УДАЛИТЬ") {
пытаться {
постоянный идентификатор = req.url.split ("/")[3];
// Удалить блог из БД
Ждите Blog.findByIdAndDelete (идентификатор);
res.writeHead (200, { "Тип содержимого": "приложение/json" });
res.end (JSON.stringify({сообщение: "Блог успешно удален" }));
} ловить (ошибка) {
res.writeHead (404, { "Тип содержимого": "приложение/json" });
разрешение.конец(JSON.stringify({ сообщение: ошибка }));
}
}
Этот блок кода извлекает я бы от URL, удаляет документ с совпадающим я бы, отправляет код состояния и заголовки и закрывает запрос.
Наконец, импорт маршрутизатор в твоей сервер.js файл и позвоните своему маршрутизатор функция, прохождение запрос а также разрешение в качестве аргументов:
константа маршрутизатор = требовать(""./маршруты/блогмаршруты");
константа сервер = http.createServer((req, res) => {
роутер (рек, рез);
});
Это позволяет вашему серверу правильно перехватывать и обрабатывать запросы.
Вы можете найти готовый проект в этом Репозиторий GitHub.
Использование фреймворка Node.js
Несмотря на то, что веб-API можно создать вручную, это может оказаться сложной задачей. Вам нужно убедиться, что вы рассмотрели множество пограничных случаев, и ваш код должен быть без ошибок.
На протяжении многих лет разработчики создавали такие фреймворки, как ExpressJS, NestJS, Fastify и т. д., чтобы сделать это намного проще.