在node.js中构建CRUD路由

时间:2014-11-03 15:31:00

标签: mysql ajax json node.js express

我的工作涉及跨多个项目的大量关系数据库工作。我正在尝试构建一组执行非常灵活的创建,检索,更新和删除查询的路由。我的目标是使这些可重复使用多个项目,所以我尽量避免硬编码。

我正在使用最新版本的Express和MySQL 2(非常适合更改数据库模块,但似乎工作正常)。我保持我的app.js干净,它只调用路由,视图引擎,并启动服务器。我的routes文件夹中有一个名为connect.js的文件(遵循我们在LAMPstack中使用的命名约定),这是我打算路由所有CRUD查询的地方。它看起来像这样:

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

var connectionpool = mysql.createPool({
    host     : 'localhost',
    user     : 'root',
    password : '',
    database : 'roster',
    pool   : {maxConnections: 50, maxIdleTime: 30}
});

// CRUD
router.post('/create', function(req, res){
	
	var into = req.body.into;
	var string = req.body.set;
	var set = JSON.parse(string);

	var query = 'INSERT INTO ?? SET ?';

	console.log(query);
	
	connectionpool.getConnection(function(err, connection){
            if(err){
                console.error('CONNECTION error: ', err);
                res.statusCode = 503;
                res.send({
                    result: 'error',
                    err: err.code
                });
            } else {
			connection.query(query, [into, set],

				function(err, rows){
					if (err) console.error(err);
					res.send(rows);
				}
			);
			connection.release();
		}
	});
});

router.post('/retrieve', function(req, res){

	var select = req.body.select;
	var from = req.body.from;
	var string = req.body.where;
	var where = JSON.parse(string);

	var query = 'SELECT ?? FROM ?? WHERE ?';

	console.log(query);
	
	connectionpool.getConnection(function(err, connection){
		console.log('enters connection function');
        if(err){
            console.error('CONNECTION error: ', err);
            res.statusCode = 503;
            res.send({
                result: 'error',
                err: err.code
            });
        } else {
			connection.query(query,	[select, from, where],
				function(err, rows){
					if (err) console.error(err);
					res.send(rows);
				}
			);
			connection.release();
		}
	});
});


router.post('/update', function(req, res){

	var update = req.body.update;
	var string1 = req.body.set;
	var set = JSON.parse(string1);
	var string2 = req.body.where;
	var where = JSON.parse(string2);

	var query = 'UPDATE ?? SET ? WHERE ?';

	console.log(query);

	connectionpool.getConnection(function(err, connection){
            if(err){
                console.error('CONNECTION error: ', err);
                res.statusCode = 503;
                res.send({
                    result: 'error',
                    err: err.code
                });
            } else {
			connection.query(query, [update, set, where],

				function(err, rows){
					if (err) console.error(err);
					res.send(rows);
				}
			);
			connection.release();
		}
	});
});

router.post('/delete', function(req, res){

	var from = req.body.from;
	var string = req.body.where;
	var where = JSON.parse(string);

	var query = 'DELETE FROM ?? WHERE ?';

	console.log(query);

	connectionpool.getConnection(function(err, connection){
            if(err){
                console.error('CONNECTION error: ', err);
                res.statusCode = 503;
                res.send({
                    result: 'error',
                    err: err.code
                });
            } else {
			connection.query(query, [from, where],

				function(err, rows){
					if (err) console.error(err);
					res.send();
				}
			);
			connection.release();
		}
	});

module.exports = router;

所以这看起来非常简单。我正在使用ajax传递要在查询中使用的json对象。一个例子是:

$(document).ready(function(){

	var where = JSON.stringify({
		school_id: '517',
		school_grade: '6'
	});

	$.post('retrieve', {
			select: '*',
			from: 'student',
			where: where
		}).done(function(data){
			console.log(data);
		});
});

我遇到的一些问题是通过路由传递JSON对象。看来我必须对该对象进行字符串化才能发布,然后在将其传递给查询之前对其进行解析。有更好的方法吗?

我愿意完全废弃我所拥有的并重新开始。

0 个答案:

没有答案