Создание 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()
}
}

}
});

Удаление

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

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}$/)
       }
    }
}
});

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

Данная публикация представляет собой перевод статьи «Create a RESTful API using NodeJS and MySQL Database» , подготовленной дружной командой проекта Интернет-технологии.ру