Advertisement
  1. Code
  2. Node.js

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

Scroll to top
Read Time: 9 min
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

() translation by (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.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.