Проблематика: Есть сервер с СУБД, например MySQL. Для управления данными в таблицах необходимо реализовать полный RestFull API интерфейс на nodeJS для каждой таблицы:
- POST — новая запись
- PUT — редактировать запись с конкретным id
- GET — получить все записи
- GET — получить запись с конкретным id
- DELETE — удалить запись с конкретным id
Очень много рутины и кода.
Задача: Написать универсальный обработчик запросов, который может обрабатывать данные любых таблиц в базе данных. Типы обрабатываемых данных — строка, текст, целое число, дробное число, дата, дата и время, булево.
Решение: Все указанные типы в JS конвертируются через строку. Шаблон единого Post запроса будет иметь вид — /table/: Имя таблицы/action/: Тип запроса.
Тип запроса — POST,PUT,GET,DELETE.
///////base set//////////////////////////////
var http = require("http");
var fs = require('fs');
var util = require('util');
var url = require('url');
var port = 3000;
var mysql = require('mysql');
var express = require('express');
var app = express();
/////////////////////////////////////////////////////
var con = mysql.createConnection({
host: '192.168.0.18',
user: 'remote',
password: 'remote',
database: "tss"
});
app.use(express.json()); // to support JSON-encoded bodies
app.use(express.urlencoded()); // to support URL-encoded bodies
con.connect(function (err) {
if (err)
throw err;
console.log("Connected to MySql database!");
});
app.listen(3000, function () {
console.log('Start : localhost:3000');
});
/////////////universal api//////////////////////////////////
app.post('/table/:tableName/action/:action', function (req, res) {
var tableName = req.params.tableName;
var action = req.params.action;
if (action === 'post') {
sqlStr = "INSERT INTO " + tableName + " (";
for (i = 0; i < Object.keys(req.body).length; i++) {
sqlStr = sqlStr + Object.keys(req.body)[i] + ",";
}
sqlStr = sqlStr.substring(0, sqlStr.length - 1);
sqlStr = sqlStr + ") VALUES (";
for (i = 0; i < Object.keys(req.body).length; i++) {
sqlStr = sqlStr + "'" + req.body[Object.keys(req.body)[i]] + "',";
}
sqlStr = sqlStr.substring(0, sqlStr.length - 1);
sqlStr = sqlStr + ")";
con.query(sqlStr, function (err, result) {
if (err)
res.end(JSON.stringify(err));
res.end(JSON.stringify(result));
});
}
if (action === 'put') {
var id = req.body.id;
sqlStr = "update " + tableName + " set ";
for (i = 0; i < Object.keys(req.body).length; i++) {
if (Object.keys(req.body)[i] === 'id') {
continue;
}
sqlStr = sqlStr + Object.keys(req.body)[i] + "='" + req.body[Object.keys(req.body)[i]] + "',"
}
sqlStr = sqlStr.substring(0, sqlStr.length - 1);
sqlStr = sqlStr + "where id = " + id;
con.query(sqlStr, function (err, result) {
if (err)
res.end(JSON.stringify(err));
res.end(JSON.stringify(result));
});
}
if (action === 'delete') {
var id = req.body.id;
sqlStr = "delete from " + tableName + " where id = "+id;
con.query(sqlStr, function (err, result) {
if (err)
res.end(JSON.stringify(err));
res.end(JSON.stringify(result));
});
}
if (action === 'get') {
var id = req.body.id;
if(id){
sqlStr = "select * from " + tableName + " where id = "+id;
}
else{
sqlStr = "select * from " + tableName;
}
con.query(sqlStr, function (err, result) {
if (err)
res.end(JSON.stringify(err));
res.end(JSON.stringify(result));
});
}
});
//////////////////////////////////////////////
Краткая инструкция:
- В строках нельзя использовать одиночную кавычку — сбивается запрос, вызывается ошибка. Двойные кавычки можно.
- Разделение десятичной дроби — точка. Например, 0.1.
- Булево значение 0 и 1.
- Дата и время — все разрешенные варианты для строки в MySQL. Тестировалось 2008-10-23 10:37:22.
- В тело запроса для типов запросов PUT, GET(для конкретной записи), DELETE — отправляем id.
- В любой таблице должен быть идентификатор id.
Автор: Пупсень и Вупсень