Универсальный RestFull API для СУБД на nodeJS

Проблематика: Есть сервер с СУБД, например 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));

        });


    }    


});

//////////////////////////////////////////////


Краткая инструкция:

  1. В строках нельзя использовать одиночную кавычку — сбивается запрос, вызывается ошибка. Двойные кавычки можно.
  2. Разделение десятичной дроби — точка. Например, 0.1.
  3. Булево значение 0 и 1.
  4. Дата и время — все разрешенные варианты для строки в MySQL. Тестировалось 2008-10-23 10:37:22.
  5. В тело запроса для типов запросов PUT, GET(для конкретной записи), DELETE — отправляем id.
  6. В любой таблице должен быть идентификатор id.
Теги:
javascript, nodejs

Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.