Данный метод не претендует на истинность, поэтому смею себе вольность рассуждать то, как можно организовать связь между клиентом в виде мобильного приложения и сервером. Учитывая, что напрямую к БД у клиента доступа нет, то все взаимодействие выборки, записи, обработки сервером организуются методом передами ключей-запросов(фильтров) POST — методом. Т.е., мы заранее определяем ключевое слово(фильтр) и порядок операций, которые будут сделаны на сервере после его отправки из клиента и ждем, когда сервер нам ответит через AJAX — ответ и все. Ниже приведу простой пример такого взаимодействия.
Примерные шаги
- Создаем URL — адрес для отправки POST — запросов с клиента. К примеру, если запросы обрабатывают данные пользователя, то логично создать URL — адрес www.myhostname.com:3000/user и на него отправлять данные;
- Учитывая, что при отправке POST — запроса мы отправляем данные в формате JSON, то один параметр должен быть флагом. Данный флаг нужен, чтобы создавать фильтры внутри одного POST — запроса на один URL.
- Организация фильтра запроса в пределах одного сеанса. К примеру {«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(); }); }); } });