Статьи

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

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

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

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

1
node -v && npm -v

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

Давайте создадим каталог проекта с именем 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»
  }
}

Прежде чем мы начнем настройку 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

Вы увидите этот ответ в терминале:

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

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

Мы также можем использовать cURL на нашем локальном сервере, который покажет нам точные заголовки и тело, которые возвращаются.

1
curl -i http://localhost:3001

Если вы закроете окно терминала в любое время, сервер уйдет.

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

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

1
curl -i http://localhost:3002

Чтобы легко обрабатывать запросы 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.