我的快递应用程序中有这样的结构:
代码:
var MariaSQL = require('mariasql');
var db = new MariaSQL();
var queries = {
getUserByID : 'SELECT * FROM user WHERE id=:id',
getUserByUsername : 'SELECT * FROM user WHERE username=:username'
};
module.exports = {
connect : function(config){
db.connect({
host : config.maria.host,
user : config.maria.user,
password : config.maria.password,
db : config.maria.db
});
db.on('connect', function() {
console.log('Successfully connected to DB');
})
.on('error', function(err) {
console.log('Connection error: ' + err);
})
.on('close', function(hadError) {
console.log('Client closed');
});
},
executeQuery : function(queryName, queryData, callback){
var data = queryData || {};
var result = [];
var error;
if(queryName in queries){
var pq = db.prepare(queries[queryName]);
db.query(pq(data))
.on('result', function(res) {
res.on('row', function(row) {
result.push(row);
})
.on('error', function(err){
error = err;
})
.on('end', function(info) {
//console.log('Result finished successfully, numRows = ' + info.numRows + ', insertid=' + info.insertId);
});
})
.on('end', function() {
if(error)
callback(error);
else
callback(null, result);
});
} else {
callback(new Error('Wrong query with name = ' + queryName));
}
}
};
在我的app.js中,我致电db_helper.connect(config);
进行初始化
连接
然后我只需调用db_helper的executeQuery
方法来执行查询并获得结果,例如:
db_helper.executeQuery('getUserByUsername', {username : username}, function(err, user){
...
});
所以,我对我有一些非常重要的问题:
Successfully connected to DB
?毕竟,当我初始化连接时,我只调用一次这个方法,不是吗?c.end()
收到所有日期时都会关闭连接。但我可以不关闭连接并使用打开的连接吗?P.S。对不起我的英文...感谢您的帮助,这是我的第一个问题:)
答案 0 :(得分:1)
我猜没有正常方式来组织项目或项目的数据访问。我建议拆分连接和查询逻辑,我不会尝试创建一个大哈希queries
来存储在中心位置使用的所有查询。
您的课程/模块/功能应该只负责一件事(参见Single responsibility principle)。这使得更改(例如添加查询)本地并且不会强制只需要查询用户,人员......的代码来查看存储在单个对象中的所有查询(请参阅Interface segregation principle)。遵循这两个原则使您的代码更易于维护(更改,扩展),并遵循node.js模块原则来创建只执行一件事情的模块。
这个答案只讨论了你问题的组织部分。