我的工作涉及跨多个项目的大量关系数据库工作。我正在尝试构建一组执行非常灵活的创建,检索,更新和删除查询的路由。我的目标是使这些可重复使用多个项目,所以我尽量避免硬编码。
我正在使用最新版本的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对象。看来我必须对该对象进行字符串化才能发布,然后在将其传递给查询之前对其进行解析。有更好的方法吗?
我愿意完全废弃我所拥有的并重新开始。