Как настроить сервер 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: «richard@piedpiper.com», 
    }, 
    { 
        id: 2, 
        name: «Bertram Gilfoyle», 
        email: «gilfoyle@piedpiper.com», 
    }, 
]; 
 | 
  Мы добавим еще один маршрут 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.