如何在nodejs中组织与数据库的交互?

我在我的快速应用程序中有一个这样的结构:

  • 数据库帮手,我用来交互我的玛丽亚分贝

码:

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方法来执行查询并得到结果fe:

     db_helper.executeQuery('getUserByUsername', {username : username}, function(err, user){ ... }); 

所以,我对我有一些非常重要的问题:

  • 这是组织与数据库交互的正常方式吗?
  • 为什么我有多条消息Successfully connected to DB ? 毕竟,当我初始化连接时,我只调用一次这个方法,不是吗?
  • 据我了解, 作者每次收到使用方法c.end()收到的date时closures连接。 但是我可以不closures连接并使用打开的连接吗?

PS对不起,我的英语…谢谢你的帮助,这是我的第一个问题:)

我想没有正常的方式来组织项目或数据访问项目。 我会build议拆分连接和查询逻辑,我不会尝试创build一个大的哈希queries来存储在中心位置使用的所有查询。

你的类/模块/函数应该只负责一件事情(见单一责任原则 )。 这使得本地更改(例如添加查询)并不会强制只查询用户,个人…的代码来查看存储在单个对象中的所有查询(请参阅接口隔离原则 )。 遵循这两个原则使得代码更易于维护(更改,扩展),并遵循node.js模块原则来创build模块,这些模块只执行一件事,而只执行一件事。

这个答案只讨论你的问题的组织部分。