1. Code
  2. JavaScript
  3. Node

Создаем наш первый API при помощи Node.js и Express: Создаем сервер

В предыдущем руководстве мы рассмотрели, что из себя представляет архитектура REST, шесть основных требований, которые выдвигаются к REST, значение методов запроса HTTP и кодов состояния ответов и структуру конечной точки RESTful API . В этом руководстве мы создадим сервер, на котором будет располагаться наш API. Вы можете создавать API при помощи любого языка программирования и любого серверного программного обеспечения, однако мы будем использовать платформу Node.js, которая является реализацией JavaScript для стороны сервера, и Express – популярный фреймворк для Node.js с самым необходимым функционалом. Установка Для начала нам необходимо убедиться, что Node.js и npm установлены глобально на нашем компьютере. Мы можем это проверить при помощи выполнения команды с флажком -v, в результате чего будут показаны установленные версии этих инструментов. Откройте вашу консоль и введите туда следующую команду: node -v && npm -v v10.8.0
Scroll to top
This post is part of a series called Code Your First API With Node.js and Express.
Code Your First API With Node.js and Express: Understanding REST APIs
Code Your First API With Node.js and Express: Connect a Database

Russian (Pусский) translation by AlexBioJS (you can also view the original English article)

Создание сервера Express для API при помощи Node.js

В предыдущем руководстве мы рассмотрели, что из себя представляет архитектура REST, шесть основных требований, которые выдвигаются к REST, значение методов запроса HTTP и кодов состояния ответов и структуру конечной точки RESTful API .

В этом руководстве мы создадим сервер, на котором будет располагаться наш API. Вы можете создавать API при помощи любого языка программирования и любого серверного программного обеспечения, однако мы будем использовать платформу Node.js, которая является реализацией JavaScript для стороны сервера, и Express – популярный фреймворк для Node.js с самым необходимым функционалом.

Установка

Для начала нам необходимо убедиться, что Node.js и npm установлены глобально на нашем компьютере. Мы можем это проверить при помощи выполнения команды с флажком -v, в результате чего будут показаны установленные версии этих инструментов. Откройте вашу консоль и введите туда следующую команду:

1
node -v && npm -v
1
v10.8.0
2
6.2.0

Версии, установленные на вашем компьютере, могут слегка отличаться от тех, что установлены у меня, однако если оба инструмента имеются, то можем приступить.

Давайте создадим папку проекта под названием express-api и перейдем в нее.

1
mkdir express-api && cd express-api

Теперь, когда мы в ней, мы можем инициализировать наш проект, выполнив команду init.

1
npm init

В результате вам будет предложен ряд вопросов о проекте, на которые вы можете как отвечать, так и нет. После настройки у вас будет файл package.json, который выглядит следующим образом:

1
{
2
  "name": "express-api",
3
  "version": "1.0.0",
4
  "description": "Node.js and Express REST API",
5
  "main": "index.js",
6
  "scripts": {
7
    "test": "echo \"Error: no test specified\" && exit 1"
8
  },
9
  "author": "Tania Rascia",
10
  "license": "MIT"
11
}

Теперь, когда у нас есть 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 теперь будет выглядеть подобно следующему:

1
{
2
  "name": "express-api",
3
  "version": "1.0.0",
4
  "description": "Node.js and Express REST API",
5
  "main": "index.js",
6
  "scripts": {
7
    "test": "echo \"Error: no test specified\" && exit 1"
8
  },
9
  "author": "Tania Rascia",
10
  "license": "MIT",
11
  "dependencies": {
12
  "dependencies": {
13
    "body-parser": "^1.18.3",
14
    "express": "^4.16.3",
15
    "mysql": "^2.16.0",
16
    "request": "^2.88.0"
17
  }
18
}

Создание сервера HTTP

Перед тем как создать сервер Express, мы быстренько создадим сервер HTTP при помощи встроенного модуля http Node, чтобы вы получили общее представление о том, как работает простенький сервер.

Создайте файл под названием hello-server.js. Загрузите модуль http, установите значение порта (я выбрала 3001) и создайте сервер при помощи метода createServer().

1
// Build a server with Node's HTTP module

2
const http = require('http');
3
const port = 3001;
4
const server = http.createServer();

Во вступительном руководстве этой серии мы рассмотрели, какую роль выполняют запросы и ответы для сервера HTTP. Мы настроим наш сервер так, чтобы он мог обрабатывать  запрос и отображать его URL-адрес на стороне сервера, а также так, чтобы на стороне клиента отображалось сообщение «Hello, server!».

1
server**on('request'** (request, response) => {
2
    console.log(`URL: ${request.url}`);
3
    response.end('Hello, server!')
4
})

Наконец, мы укажем серверу, какой порт прослушивать и будем выводить ошибки при их наличии.

1
// Start the server

2
server.listen(port, (error) => {
3
    if (error) return console.log(`Error: ${error}`);
4
5
    console.log(`Server is listening on port ${port}`)
6
})

Теперь мы можем запустить наш сервер при помощи команды node, за которой следует имя файла.

1
node hello-server.js

Вы увидите ответ в консоли.

1
Server is listening on port 3001

Для того чтобы проверить, действительно ли запустился сервер, перейдите в вашем браузере по адресу https://localhost:3001/. Если все нормально, то вы увидите «Hello, server!» на странице. В вашей консоли вы увидите запрошенный URL-адрес.

1
URL: /
2
URL: /favicon.ico

Если бы вы перешли по адресу http://localhost:3001/hello, то увидели бы URL: /hello.

Также мы можем использовать инструмент cURL на нашем локальном сервере, за счет чего нам будут показаны точные возвращенные заголовки и тело ответа.

1
curl -i http://localhost:3001
1
HTTP/1.1 200 OK
2
Date: Wed, 15 Aug 2018 22:14:23 GMT
3
Connection: keep-alive
4
Content-Length: 14
5
6
Hello, server!

Если вы закроете консоль, когда захотите, то сервер прекратит работу.

Теперь, когда мы получили общее представление о том, как работает сервер, запрос и ответ вместе, мы можем переписать этот код для Express, интерфейс которого даже проще и возможности которого более широки.

Создаем сервер Express

Мы создадим новый файл, app.js, который будет выступать в роли точки входа (* файл для запуска приложения) для собственно нашего проекта. Так же как и в случае с оригинальным сервером http, мы запросим модуль и укажем порт для запуска сервера.

Создайте файл app.js и добавьте туда следующий код:

1
// Require packages and set the port

2
const express = require('express');
3
const port = 3002;
4
const app = express();

Теперь, вместо того чтобы прослушивать все запросы, мы явно укажем серверу, что нам необходимы только запросы, выполненные по методу GET к корневой папке сервера (/). При получении конечной точкой запроса «/» мы отобразим запрошенный URL-адрес и выведем сообщение «Hello, Server!».

1
app.get('/', (request, response) => {
2
    console.log(`URL: ${request.url}`);
3
    response.send('Hello, Server!');
4
});

Наконец, мы запустим сервер, который будет прослушивать запросы, выполненные по 3002 порту, при помощи метода listen().

1
// Start the server

2
const server = app.listen(port, (error) => {
3
    if (error) return console.log(`Error: ${error}`);
4
5
    console.log(`Server listening on port ${server.address().port}`);
6
});

Мы можем запустить сервер при помощи команды node app.js, как и ранее, однако мы можем изменить свойство scripts в файле package.json для автоматического запуска этой конкретной команды.

1
"scripts": {
2
  "start": "node app.js"
3
},

Теперь мы можем использовать команду npm start для запуска сервера, и после запуска мы увидим сообщение в консоли.

1
Server listening on port 3002

Если мы выполним команду curl -i для обсуждаемого URL-адреса, то увидим, что сервер в этом случае работает на базе Express и что имеются некоторые дополнительные заголовки вроде Content-Type.

1
curl -i http://localhost:3002
1
HTTP/1.1 200 OK
2
X-Powered-By: Express
3
Content-Type: text/html; charset=utf-8
4
Content-Length: 14
5
ETag: W/"e-gaHDsc0MZK+LfDiTM4ruVL4pUqI"
6
Date: Wed, 15 Aug 2018 22:38:45 GMT
7
Connection: keep-alive
8
9
Hello, Server!

Добавляем промежуточное ПО для разбора тела запросов

Для того чтобы облегчить работу с запросами по методам POST и PUT к нашему API, мы добавим промежуточное ПО для разбора тела запроса. Тут нам и пригождается модуль body-parser. За счет этого модуля будет извлечено все тело пришедшего запроса, а  его данные преобразованы в JSON-объект, с которым мы можем работать.

Мы просто запросим модуль вверху кода нашего файла. Добавьте следующую инструкцию require в верхнюю часть вашего файла app.js.

1
const bodyParser = require('body-parser');
2
...

Затем мы укажем нашему приложению Express, что необходимо использовать body-parser и преобразовывать данные в формат JSON.

1
// Use Node.js body parsing middleware

2
app.use(bodyParser.json());
3
app.use(bodyParser.urlencoded({
4
    extended: true,
5
}));

Также давайте изменим наше сообщение таким образом, чтобы вместо простого текста в качестве ответа отправлялся JSON-объект.

1
response.send({message: 'Node.js and Express REST API'});

Далее приводится код нашего файла app.js, который имеем на данный момент:

1
// Require packages and set the port

2
const express = require('express');
3
const port = 3002;
4
const bodyParser = require('body-parser');
5
const app = express();
6
7
// Use Node.js body parsing middleware

8
app.use(bodyParser.json());
9
app.use(bodyParser.urlencoded({
10
    extended: true,
11
}));
12
13
app.get('/', (request, response) => {
14
    response.send({
15
        message: 'Node.js and Express REST API'}
16
    );
17
});
18
19
// Start the server

20
const server = app.listen(port, (error) => {
21
    if (error) return console.log(`Error: ${error}`);
22
23
    console.log(`Server listening on port ${server.address().port}`);
24
});

Если вы отправите запрос при помощи curl -i на сервер, то увидите, что в заголовке Content-Type теперь указано значение application/json; charset=utf-8.

Настраиваем маршруты

Пока что у нас имеется только маршрут для обработки запросов по методу GET к корню приложения «/»), однако наш API также должен быть способен обрабатывать запросы HTTP по всем главным методам к различным URL. Мы настроим маршрутизатор (* предоставляет функциональные возможности для обработки ответов) и добавим некоторые выдуманные данные для отправления пользователю.

Давайте создадим новую папку под названием routes и файл под названием routes.js. Мы подключим его вверху app.js.

1
const routes = require('./routes/routes');

Обратите внимание на то, что расширение .js в require указывать необязательно. Теперь мы переместим маршрут для обработки запросов GET в routes.js. Добавьте следующий код в routes.js:

1
const router = app => {
2
    app.get('/', (request, response) => {
3
        response.send({
4
            message: 'Node.js and Express REST API'
5
        });
6
    });
7
}

Наконец, экспортируйте маршрутизатор, чтобы мы могли им воспользоваться в нашем файле app.js

1
// Export the router

2
module.exports = router;

В app.js замените имеющийся код app.get() вызовом routes():

1
routes(app);

Теперь вы могли бы перейти по http://localhost:3002 и увидеть то же, что и ранее. (Не забудьте перезапустить сервер!)

После удачной настройки вышеуказанного мы предоставим некоторые данные в формате JSON при помощи другого маршрута. Пока что мы воспользуемся просто выдуманными данными, поскольку наша база данных еще не создана.

Давайте создадим переменную users в routes.js с некоторыми выдуманными пользовательскими данными в формате JSON.

1
const users = [{
2
        id: 1,
3
        name: "Richard Hendricks",
4
        email: "richard@piedpiper.com",
5
    },
6
    {
7
        id: 2,
8
        name: "Bertram Gilfoyle",
9
        email: "gilfoyle@piedpiper.com",
10
    },
11
];

Мы добавим еще один маршрут для обработки запросов по адресу /users и методу GET в наш маршрутизатор и будем отправлять с его помощью пользовательские данные.

1
app.get('/users', (request, response) => {
2
    response.send(users);
3
});

После перезапуска сервера теперь вы можете перейти по http://localhost:3002/users и увидеть все наши данные.

Обратите внимание: если у вас не установлено в браузере расширения для просмотра файлов в формат JSON, то я вам очень рекомендую скачать его, например JSONView для Chrome. Благодаря этому вам будет намного проще читать данные!

Посетите репозиторий GitHub, чтобы ознакомиться с конечным кодом для этого поста и сравните его со своим.

Заключение

В этом руководстве мы рассмотрели, как создать сервер при помощи встроенного модуля Node HTTP и при помощи Express, как назначить маршруты для запросов, выполняемых по различным URL-адресам, и как получать пришедшие в запросах по методу GET данные в формате JSON.

В последнем руководстве этой серии мы подключим наш сервер Express к MySQL для создания, просмотра, обновления и удаления пользователей из нашей базы данных, завершая реализацию функциональных возможностей нашего API.