Один из методов организации связи по методике REST клиент-серверного приложения

Данный метод не претендует на истинность, поэтому смею себе вольность рассуждать то, как можно организовать связь между клиентом в виде мобильного приложения и сервером. Учитывая, что напрямую к БД у клиента доступа нет, то все взаимодействие выборки, записи, обработки сервером организуются методом передами ключей-запросов(фильтров) POST — методом. Т.е., мы заранее определяем ключевое слово(фильтр) и порядок операций, которые будут сделаны на сервере после его отправки  из клиента и ждем, когда сервер нам ответит через AJAX — ответ и все. Ниже приведу простой пример такого взаимодействия.

Примерные шаги

  1. Создаем URL — адрес для отправки POST — запросов с клиента. К примеру, если запросы обрабатывают данные пользователя, то логично создать URL — адрес www.myhostname.com:3000/user и на него отправлять данные;
  2. Учитывая, что при отправке POST — запроса мы отправляем данные в формате JSON, то один параметр должен быть флагом. Данный флаг нужен, чтобы создавать фильтры внутри одного POST — запроса на один URL.
  3. Организация фильтра запроса в пределах одного сеанса. К примеру {«flag»:»read»,»userName»:»David», …}, что означает, что мы хотим прочесть юзера под определенным логином, после чего сервер возвратит клиенту запрощенные данные.

 

Разбираемся в каждом шаге

Создание URL для запроса — это обычное создание страницы в Node.js, с которого данные будут обрабатывать в POST — запросе. Лучще воспользоваться для этого express.js . Для этого создаем необходимую страницу в директориях views/routes как обычно это делается для приложения express.js. К  примеру так в папке views/users.pug:

extends layout

block content
  h1= title
  p Welcome to #{title}

и файл приема запросов routes/users.js:

var express = require('express');
var router = express.Router();

/* GET users listing. */
router.get('/', function(req, res, next) {
  res.render('users', { title: 'User Page' });
});

module.exports = router;

После этого по пути www.myhostname.com:3000/users сервер будет принимать данные в POST или в GET режиме. Для обработки этих запросов пишем в главном файлу сервера app.js обработчики этих запросов, учитывая URL — запроса. К примеру, чтобы обработать все запросы к URL www.myhostname.com:3000/users прописываем следующие строки:

...
//Регистрируем новый URL-страницу
var users = require('./routes/users');
...
//Указываем на использование этой страницы и обрабатываем запросы
app.use('/users', users);
app.post('/users', function(req, res) {
    //Даем доступ клиенту на обработку его данных сервером
    res.set({
        'Access-Control-Allow-Origin': '*',
        'Access-Control-Allow-Methods': 'GET, POST, OPTIONS, PUT, PATCH, DELETE',
        'Access-Control-Allow-Headers': 'X-Requested-With',
        'Access-Control-Allow-Credentials': 'true'
    });
    
    //Получаем данные от клиента
    var data = req.body;
    
    //...тут какая-то общая логика обработки
    
    //...Обработка для фильтра userReadFromDb
    if(data.key=="userReadFromDb")
    {
        //...тут какая-то локальная логика обработки
        //Отправляем результаты обработки обратно клиенту
        res.json({"key":data.key,"info":"Ok"});
    }else
    //...Обработка для фильтра userWriteToDb
    if(data.key=="userWriteToDb")
    {
        //...тут какая-то лоакльная логика обработки
        //Отправляем результаты обработки обратно клиенту
        res.json({"key":data.key,"info":"Ok"}); 
    }
    ...
});
...

Стоит отметить, что получаемые фильтры от клиента и отправляются ему обратно. Это нужно, чтобы в приложении клиента идентифицировать факт удачного обновления данных или получения определенных данных по указанному фильтру. Это очень удобно и экономит массу строк кода.

 

REST при помощи пулл соединений MySQL/Node.js

Выше описан стандартный механизм соединения приложения с MySQL. Ниже код, который организует это при помощи пулла соединений, который гораздо легче настривать без непредвиденных ошибок:

var mysql = require('mysql');

var dbConfig = {
    host: "myhost",
    user: "user",
    password: "password",
    database: "dbname",
    port:3306
};

var user = require('./routes/user');
app.use('/user', user);
app.post('/user', function(req, res) {
    res.set({
        'Access-Control-Allow-Origin': '*',
        'Access-Control-Allow-Methods': 'GET, POST, OPTIONS, PUT, PATCH, DELETE',
        'Access-Control-Allow-Headers': 'X-Requested-With',
        'Access-Control-Allow-Credentials': 'true'
    });
    var data = req.body;
    var mysqlPool  = mysql.createPool(dbConfig);
    if(data.key=="ENTER_CUSTOMER")
    {
        mysqlPool.getConnection(function(err, connection) {
            if(err) throw err;
            connection.query("SELECT * FROM user where email LIKE '"+data.userName+"'", function(err, result, fields) {
                if(err) {
                    connection.release();
                    console.error(err);                   
                    return;
                }
                res.json({"key":data.key,"result":result});
                connection.release();
            });
        }); 
    }
});