Создание 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
Пожалуйста, опубликуйте свои комментарии по текущей теме статьи. За комментарии, дизлайки, подписки, отклики, лайки низкий вам поклон!