Как настроить сервер Express API в Node.js
В предыдущем уроке мы узнали, что такое архитектура REST, шесть направляющих ограничений REST, как понимать методы HTTP-запросов и их коды ответов, а также анатомию конечной точки API RESTful.
В этом уроке мы настроим сервер, на котором будет работать наш API. Вы можете создать API с любым языком программирования и серверным программным обеспечением, но мы будем использовать Node.js , который является серверной реализацией JavaScript, и Express , популярную минимальную среду для Node.
Установка
Наша первая предпосылка — убедиться, что Node.js и npm установлены на компьютере глобально. Мы можем протестировать оба, используя флаг -v
, который покажет версию. Откройте командную строку и введите следующее.
1
|
node -v && npm -v
|
v10.8.0 6.2.0
Ваши версии могут немного отличаться от моих, но пока они есть, мы можем начать.
Давайте создадим каталог проекта с именем express-api
и перейдем к нему.
1
|
mkdir express-api && cd express-api
|
Теперь, когда мы находимся в нашем новом каталоге, мы можем инициализировать наш проект с помощью команды init.
1
|
npm init
|
Эта команда предложит вам ответить на несколько вопросов о проекте, которые вы можете заполнить или нет. После завершения установки у вас будет файл package.json, который выглядит следующим образом:
01
02
03
04
05
06
07
08
09
10
11
|
{
«name»: «express-api»,
«version»: «1.0.0»,
«description»: «Node.js and Express REST API»,
«main»: «index.js»,
«scripts»: {
«test»: «echo \»Error: no test specified\» && exit 1″
},
«author»: «Tania Rascia»,
«license»: «MIT»
}
|
Теперь, когда у нас есть package.json , мы можем установить зависимости, необходимые для нашего проекта. К счастью, нам не требуется слишком много зависимостей, только эти четыре перечислены ниже.
- body-parser : промежуточное ПО для разбора тела.
- express : минималистичный веб-фреймворк, который мы будем использовать для нашего сервера.
- mysql : драйвер MySQL.
- request (необязательно): простой способ совершать HTTP-вызовы.
Мы будем использовать команду install
сопровождаемую каждой зависимостью, чтобы завершить настройку нашего проекта.
1
|
npm install body-parser express mysql request
|
Это создаст файл package-lock.json и каталог node_modules , и наш package.json будет обновлен и будет выглядеть примерно так:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
{
«name»: «express-api»,
«version»: «1.0.0»,
«description»: «Node.js and Express REST API»,
«main»: «index.js»,
«scripts»: {
«test»: «echo \»Error: no test specified\» && exit 1″
},
«author»: «Tania Rascia»,
«license»: «MIT»,
«dependencies»: {
«dependencies»: {
«body-parser»: «^1.18.3»,
«express»: «^4.16.3»,
«mysql»: «^2.16.0»,
«request»: «^2.88.0»
}
}
|
Настройка HTTP-сервера
Прежде чем мы начнем настройку Express-сервера, мы быстро настроим HTTP-сервер со встроенным http
модулем Node, чтобы понять, как работает простой сервер.
Создайте файл с именем hello-server.js . Загрузите модуль http
, установите номер порта (я выбрал 3001
) и создайте сервер с помощью createServer()
.
1
2
3
4
|
// Build a server with Node’s HTTP module
const http = require(‘http’);
const port = 3001;
const server = http.createServer();
|
Во вступительной статье REST мы обсудили, что такое запросы и ответы в отношении HTTP-сервера. Мы собираемся настроить наш сервер для обработки запроса и отобразить URL-адрес, запрашиваемый на стороне сервера, и отобразить сервер Hello! сообщение клиенту на стороне ответа.
1
2
3
4
|
server**on(‘request’** (request, response) => {
console.log(`URL: ${request.url}`);
response.end(‘Hello, server!’)
})
|
Наконец, мы сообщим серверу, какой порт прослушивать, и отобразим ошибку, если она есть.
1
2
3
4
5
6
|
// Start the server
server.listen(port, (error) => {
if (error) return console.log(`Error: ${error}`);
console.log(`Server is listening on port ${port}`)
})
|
Теперь мы можем запустить наш сервер с node
за которым следует имя файла.
1
|
node hello-server.js
|
Вы увидите этот ответ в терминале:
Сервер прослушивает порт 3001
Чтобы убедиться, что сервер действительно работает, перейдите по адресу https://localhost:3001/
в адресной строке браузера. Если все работает правильно, вы должны увидеть Hello, server! на странице. В вашем терминале вы также увидите запрошенные URL-адреса.
URL: / URL: /favicon.ico
Если бы вам пришлось перейти по http://localhost:3001/hello
, вы бы увидели URL: /hello
.
Мы также можем использовать cURL на нашем локальном сервере, который покажет нам точные заголовки и тело, которые возвращаются.
1
|
curl -i http://localhost:3001
|
HTTP / 1.1 200 ОК Дата: среда, 15 августа 2018 22:14:23 GMT Подключение: keep-alive Длина контента: 14 Привет, сервер!
Если вы закроете окно терминала в любое время, сервер уйдет.
Теперь, когда у нас есть представление о том, как сервер, запрос и ответ работают вместе, мы можем переписать это в Express, который имеет еще более простой интерфейс и расширенные функции.
Настройка Экспресс-сервера
Мы собираемся создать новый файл app.js , который будет точкой входа в наш реальный проект. Как и в случае с оригинальным http-сервером, нам потребуется модуль и порт для запуска.
Создайте файл app.js и поместите в него следующий код.
1
2
3
4
|
// Require packages and set the port
const express = require(‘express’);
const port = 3002;
const app = express();
|
Теперь вместо того, чтобы искать все запросы, мы прямо заявим, что ищем GET
в корне сервера ( /
). Когда /
получит запрос, мы отобразим запрошенный URL и «Привет, сервер!» сообщение.
1
2
3
4
|
app.get(‘/’, (request, response) => {
console.log(`URL: ${request.url}`);
response.send(‘Hello, Server!’);
});
|
Наконец, мы запустим сервер через порт 3002
методом listen()
.
1
2
3
4
5
6
|
// Start the server
const server = app.listen(port, (error) => {
if (error) return console.log(`Error: ${error}`);
console.log(`Server listening on port ${server.address().port}`);
});
|
Мы можем запустить сервер с node app.js
как и раньше, но мы также можем изменить свойство scripts
в нашем файле package.json для автоматического запуска этой конкретной команды.
1
2
3
|
«scripts»: {
«start»: «node app.js»
},
|
Теперь мы можем использовать npm start
для запуска сервера, и мы увидим сообщение нашего сервера в терминале.
Сервер прослушивает порт 3002
Если мы запустим curl -i
для URL-адреса, мы увидим, что он теперь работает на Express, и есть несколько дополнительных заголовков, таких как Content-Type
.
1
|
curl -i http://localhost:3002
|
HTTP / 1.1 200 ОК X-Powered-By: Экспресс Content-Type: text / html; кодировка = UTF-8 Длина контента: 14 ETag: W / "e-gaHDsc0MZK + LfDiTM4ruVL4pUqI" Дата: среда, 15 августа 2018 22:38:45 по Гринвичу Подключение: keep-alive Привет, Сервер!
Добавить промежуточное ПО для разбора тела
Чтобы легко обрабатывать запросы POST
и PUT
к нашему API, мы добавим промежуточное ПО для анализа тела. Вот где приходит наш модуль body-parser
. body-parser
извлечет все тело входящего запроса и проанализирует его в объект JSON, с которым мы можем работать.
Нам просто потребуется модуль в верхней части нашего файла. Добавьте следующий оператор require
в начало файла app.js.
1
2
|
const bodyParser = require(‘body-parser’);
…
|
Тогда мы скажем нашему приложению Express использовать body-parser
и искать JSON.
1
2
3
4
5
|
// Use Node.js body parsing middleware
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: true,
}));
|
Кроме того, давайте изменим наше сообщение для отправки объекта JSON в качестве ответа вместо простого текста.
1
|
response.send({message: ‘Node.js and Express REST API’});
|
Ниже приведен наш полный файл app.json в его нынешнем виде.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
// Require packages and set the port
const express = require(‘express’);
const port = 3002;
const bodyParser = require(‘body-parser’);
const app = express();
// Use Node.js body parsing middleware
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: true,
}));
app.get(‘/’, (request, response) => {
response.send({
message: ‘Node.js and Express REST API’}
);
});
// Start the server
const server = app.listen(port, (error) => {
if (error) return console.log(`Error: ${error}`);
console.log(`Server listening on port ${server.address().port}`);
});
|
Если вы отправите curl -i
на сервер, вы увидите, что заголовок теперь возвращает Content-Type: application/json; charset=utf-8
Content-Type: application/json; charset=utf-8
.
Настройка маршрутов
Пока у нас есть только GET
маршрут к корню ( /
), но наш API должен быть в состоянии обрабатывать все четыре основных метода HTTP-запроса для нескольких URL-адресов. Мы собираемся настроить маршрутизатор и сделать некоторые поддельные данные для отображения.
Давайте создадим новый каталог с именем маршрутов и файл в файле маршрутов .js . Мы свяжемся с ним в верхней части app.js.
1
|
const routes = require(‘./routes/routes’);
|
Обратите внимание, что расширение .js
не требуется в require. Теперь мы переместим слушателя GET
нашего приложения в rout.js. Введите следующий код вways.js .
1
2
3
4
5
6
7
|
const router = app => {
app.get(‘/’, (request, response) => {
response.send({
message: ‘Node.js and Express REST API’
});
});
}
|
Наконец, экспортируйте router
чтобы мы могли использовать его в нашем файле app.js.
1
2
|
// Export the router
module.exports = router;
|
В app.js замените код app.get()
который у вас был ранее, вызовом app.get()
routes()
:
1
|
routes(app);
|
Теперь вы сможете перейти на http://localhost:3002
и увидеть то же самое, что и раньше. (Не забудьте перезагрузить сервер!)
Как только все будет настроено и будет работать должным образом, мы передадим некоторые данные JSON другим маршрутом. Сейчас мы будем использовать только поддельные данные, поскольку наша база данных еще не настроена.
Давайте создадим users
переменную вways.js с некоторыми поддельными пользовательскими данными в формате JSON.
01
02
03
04
05
06
07
08
09
10
11
|
const users = [{
id: 1,
name: «Richard Hendricks»,
email: «[email protected]»,
},
{
id: 2,
name: «Bertram Gilfoyle»,
email: «[email protected]»,
},
];
|
Мы добавим еще один маршрут GET
к нашему маршрутизатору /users
и отправим данные пользователя через него.
1
2
3
|
app.get(‘/users’, (request, response) => {
response.send(users);
});
|
После перезапуска сервера вы можете перейти по http://localhost:3002/users
и просмотреть все наши данные.
Примечание. Если в вашем браузере нет расширения для просмотра JSON, я настоятельно рекомендую загрузить его, например JSONView for Chrome. Это сделает данные намного проще для чтения!
Посетите наш репозиторий GitHub, чтобы увидеть готовый код этого поста и сравнить его со своим.
Вывод
В этом руководстве мы узнали, как настроить встроенный HTTP-сервер и сервер Express в узле, направлять запросы и URL-адреса и использовать данные JSON при получении запросов.
В последней части серии API RESTful мы подключим наш сервер Express к MySQL, чтобы создавать, просматривать, обновлять и удалять пользователей в базе данных, завершая работу нашего API.