Pull to refresh

Универсальный 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.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.