Создание RESTful API с использованием NodeJS и MySQL

REST (Representational State Transfer) представляет собой набор принципов построения веб-службы, предназначенной для изменения или просмотра информации без обращения к серверу. Использование RESTful API экономит время. Так как REST является наиболее эффективным и распространенным стандартом создания API для интернет-сервисов.

Рассмотрим, как создать RESTful API, используя для обработки HTTP-запросов NodeJS. Вы сможете использовать его с любым приложением, которое отправляет HTTP-запрос. Это оптимальный способ, особенно если создаете мобильное приложение.

Node Restful — Загрузить проект с Github

Для начала установите NodeJS и MySQL, создайте таблицы или загрузите БД из Git-репозитория.

Таблица пользователей

Содержит всю регистрационную информацию пользователей.

CREATE TABLE `users` (
`uid` int(11) AUTO_INCREMENT,
`username` varchar(50),
`password` varchar(200),
`email` varchar(200),
PRIMARY KEY (`uid`)
);

Таблица сообщений

Здесь хранятся все сообщения пользователей.

CREATE TABLE `messages` (
`mid` int(11) AUTO_INCREMENT,
`message` text,
`uid_fk` int(11),
PRIMARY KEY (`mid`)
);
Таблица сообщений

Настройка проекта Node Restful

Зайдите в терминал или командную строку и создайте папку проекта.

$ mkdir nodeRestful

$ cd nodeRestful

Инициализируйте проект NodeJS. В результате будет создан файл package.json.

$ node init

Установите для RESTful API плагин hapi.js .

$ npm install hapi --save

Создание сервера Node Hapi

server.js

Откройте текстовый редактор, создайте новый файл и скопируйте в него приведенный ниже код. В нем const (JavaScript ES6) — это идентификатор, который не будет переопределяться. Если хотите, можно использовать var .

'use strict';
const Hapi = require('hapi');

// Создание сервера с хостом и портом
const server = new Hapi.Server();
server.connection({ 
    host: 'localhost', 
    port: 8000 
});

// Добавление маршрута
server.route({
    method: 'GET',
    path:'/helloworld', 
    handler: function (request, reply) {
    return reply('hello world');
}
});

server.start((err) => {
   if (err) {
     throw err;
   }
  console.log('Server running at:', server.info.uri);
});

Запустите проект

$ sudo npm start

Откройте в браузере URL-адрес http://localhost:8000/helloworld, и вы увидите текст «hello world»:

Подключение к базе данных

База данных MySQL

Используя менеджер пакетов NodeJS (NPM), установите пакет MySQL для NodeJS.

$ npm install mysql –save

server.js


В файл server.js добавьте код подключения к MySQL. В приведенном ниже примере измените имя базы данных, хост, имя пользователя и пароль.

'use strict';
const Hapi = require('hapi');
const MySQL = require('mysql');

// Создание сервера с хостом и портом
const server = new Hapi.Server();

const connection = MySQL.createConnection({
     host: 'localhost',
     user: 'username',
     password: 'password',
     database: 'database_name'
});

server.connection({
    host: 'localhost',
    port: 8000
});

connection.connect();

Получение информации о пользователях

Скачайте расширение poster для браузера Google Chrome. Оно поможет проверить RESTful API.

http://localhost:8000/users

server.route({
    method: 'GET',
    path: '/users',
    handler: function (request, reply) {
       connection.query('SELECT uid, username, email FROM users',
       function (error, results, fields) {
       if (error) throw error;

       reply(results);
    });
  }
});
Получение информации о пользователях

Работа с параметрами

Проверка параметров

Для обеспечения валидности входных данных установите пакет Joi для NodeJS.

$ npm install joi --save
Username validation minimum value 3 characters and maximum 30. 
username: Joi.string().alphanum().min(3).max(30).required()

Password regular expression min 8 and max 30 
password: Joi.string().regex(/^[a-zA-Z0-9]{8,30}$/)

Message validation supports both strings and numbers. 
message: [Joi.string(), Joi.number()]

Birth year validation
birthyear: Joi.number().integer().min(1900).max(2013)

Email validation
email: Joi.string().email()

Получение данных пользователя

Здесь мы получаем данные пользователя на основе значения uid, Joi.number(). integer() проверяет ввод идентификатора пользователя.

http://localhost:8000/user/1

const Joi = require('joi');

server.route({
    method: 'GET',
    path: '/user/{uid}',
    handler: function (request, reply) {
    const uid = request.params.uid;

    connection.query('SELECT uid, username, email FROM users WHERE uid = "' + uid +'"',
    function (error, results, fields) {
       if (error) throw error;

       reply(results);
    });
    },
   config: {
       validate: {
        params: {
        uid: Joi.number().integer()
       }
  }
}
});
Получение данных пользователя

POST

Параметры сообщения работают с помощью payload.

http://localhost:8000/messages

server.route({
    method: 'POST',
    path: '/messages',
    handler: function (request, reply) {

    const uid = request.payload.uid;
    connection.query('SELECT * FROM messages WHERE uid_fk = "' + uid + '"',
    function (error, results, fields) {
        if (error) throw error;

        reply(results);
    });
},
config: {
    validate: {
    payload: {
    uid: Joi.number().integer()
}
}

}
});
POST

Удаление

Удаление данных о посте на основе идентификатора пользователя и сообщения.

http://localhost:8000/message/1/3

server.route({
    method: 'DELETE',
    path: '/message/{uid}/{mid}',
    handler: function (request, reply) {
    const uid = request.params.uid;
    const mid = request.params.mid;
    connection.query('DELETE FROM messages WHERE uid_fk = "' + uid + '"AND 
    mid = "' + mid + '"',
    function (error, result, fields) {
       if (error) throw error;

       if (result.affectedRows) {
           reply(true);
       } else {
           reply(false);
       }
});
},
config: {
     validate: {
     params: {
       uid: Joi.number().integer(),
       mid: Joi.number().integer()
      }
     }
}
}); 
Удаление

Шифрование

Нам нужно зашифровать пароль пользователя. Для этого используем пакет bcrypt .

$ npm install bcrypt --save
Шифрование
server.route({
    method: 'POST',
    path: '/signup',
    handler: function (request, reply) {
    const username = request.payload.username;
    const email = request.payload.email;
    const password = request.payload.password;

    //Encryption
    var salt = Bcrypt.genSaltSync();
    var encryptedPassword = Bcrypt.hashSync(password, salt);

    //Decrypt
    var orgPassword = Bcrypt.compareSync(password, encryptedPassword);

    connection.query('INSERT INTO users (username,email,passcode) VALUES 
    ("' + username + '","' + email + '","' + encryptedPassword + '")',
    function (error, results, fields) {
        if (error) throw error;

        reply(results);
    });
},
config: {
      validate: {
       payload: {
          username: Joi.string().alphanum().min(3).max(30).required(),
          email: Joi.string().email(),
          password: Joi.string().regex(/^[a-zA-Z0-9]{8,30}$/)
       }
    }
}
});
Шифрование - 2

Node Restful — Загрузить этот проект с Github

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

Пожалуйста, оставьте ваши комментарии по текущей теме материала. Мы крайне благодарны вам за ваши комментарии, подписки, отклики, дизлайки, лайки!

Вадим Дворниковавтор-переводчик статьи «Create a RESTful API using NodeJS and MySQL Database»