Node.js/Express.js :数据库查询的工厂设计模式
Node.js/Express.js : Factory design pattern for DB queries
我是 Node.js/Express.js 的新手,正在尝试用它们构建一个基本网站。
我用 node-mysql 处理我的数据库查询,但现在我正在做一些很棒的代码,例如:
router.get('/', function(req, res, next) {
var query = 'INSERT INTO users(token) VALUES (?)';
connection.query(query, [req.query.token], function(err, rows, fields) {
if (err) throw err;
res.cookie('token', req.query.token);
});
我有 10 条不同的路线,每条路线的查询都是硬编码的。
我希望能够构建数据库工厂,因此我的代码如下所示:
router.get('/', function(req, res, next) {
var success = userFactory.InsertToken(req.query.token);
if (success) //maybe a callback instead
res.cookie('token', req.query.token);
});
这样做的最佳做法是什么?
在原型层面上,我尝试为您编写一小段存根。这段代码可能有一些错误,因为代码的想法是为了演示代码的分离并放在适当的位置。
route.js
'use strict';
var Controller = require('./controller');
router.get('/', function(req, res, next) {
Cotroller.InsertToken(req, res, function(err, data){
if(err){
// handle error.
}else{
// handle data
res.send(data);
}
});
});
controller.js
'use strict';
var UserModel = require('./user');
/**
* State of model should be changed from here, this allows you to change certain Api without affecting other (as far as model remain same).
*/
module.export.InsertToken = function(req, res, cb){
// create user agaist which this token needs to be inserted.
var user = new UserModel();
user.insert(req.query.token, function(err, data){
if(err){
return cb(err);
}else{
return cb(data);
}
});
}
user.js
'use strict';
var userDao = require('./UserDao');
/*
* All business actions should be taken here.
*/
module.export.User = function(){
// add user properties here...
};
User.prototype.InsertToken = function(arguments, cb) {
// Take business action before adding the token.
userDao.insertToken(arguments, cb);
};
userDao.js
'use strict';
var queryFactory = require('./queryFactory').QueryFactory;
// All DB connection handling is centralized under one hood.
module.exports.InsertToken = function(arguments, cb){
var queryID = 'InsertUserQuery';
var query = queryFactory.getQuery(queryID);
// obtain db connection and make query as usual.
}
queryFactory.js
'use strict';
module.exports.QueryFactory = function(){
var QueryMap = {
'InsertUserQuery': 'Insert into user(token) values(?)';
}
return function getQuery(QueryID){
return QueryMap[QueryID];
}
}
注意:
我认为这种解决方案最适合中等规模的应用程序。由于代码分离可以通过 n 种方式完成,因此它们是这个问题的 n 种解决方案,这使得它成为自以为是的问题。
如果您的应用程序有点复杂并且包含相当多的业务逻辑,那么根据此解决方案,您的 user.js 将会很大,您可能希望将真正的业务逻辑从模型层移动到服务层。
我是 Node.js/Express.js 的新手,正在尝试用它们构建一个基本网站。
我用 node-mysql 处理我的数据库查询,但现在我正在做一些很棒的代码,例如:
router.get('/', function(req, res, next) {
var query = 'INSERT INTO users(token) VALUES (?)';
connection.query(query, [req.query.token], function(err, rows, fields) {
if (err) throw err;
res.cookie('token', req.query.token);
});
我有 10 条不同的路线,每条路线的查询都是硬编码的。
我希望能够构建数据库工厂,因此我的代码如下所示:
router.get('/', function(req, res, next) {
var success = userFactory.InsertToken(req.query.token);
if (success) //maybe a callback instead
res.cookie('token', req.query.token);
});
这样做的最佳做法是什么?
在原型层面上,我尝试为您编写一小段存根。这段代码可能有一些错误,因为代码的想法是为了演示代码的分离并放在适当的位置。
route.js
'use strict';
var Controller = require('./controller');
router.get('/', function(req, res, next) {
Cotroller.InsertToken(req, res, function(err, data){
if(err){
// handle error.
}else{
// handle data
res.send(data);
}
});
});
controller.js
'use strict';
var UserModel = require('./user');
/**
* State of model should be changed from here, this allows you to change certain Api without affecting other (as far as model remain same).
*/
module.export.InsertToken = function(req, res, cb){
// create user agaist which this token needs to be inserted.
var user = new UserModel();
user.insert(req.query.token, function(err, data){
if(err){
return cb(err);
}else{
return cb(data);
}
});
}
user.js
'use strict';
var userDao = require('./UserDao');
/*
* All business actions should be taken here.
*/
module.export.User = function(){
// add user properties here...
};
User.prototype.InsertToken = function(arguments, cb) {
// Take business action before adding the token.
userDao.insertToken(arguments, cb);
};
userDao.js
'use strict';
var queryFactory = require('./queryFactory').QueryFactory;
// All DB connection handling is centralized under one hood.
module.exports.InsertToken = function(arguments, cb){
var queryID = 'InsertUserQuery';
var query = queryFactory.getQuery(queryID);
// obtain db connection and make query as usual.
}
queryFactory.js
'use strict';
module.exports.QueryFactory = function(){
var QueryMap = {
'InsertUserQuery': 'Insert into user(token) values(?)';
}
return function getQuery(QueryID){
return QueryMap[QueryID];
}
}
注意:
我认为这种解决方案最适合中等规模的应用程序。由于代码分离可以通过 n 种方式完成,因此它们是这个问题的 n 种解决方案,这使得它成为自以为是的问题。
如果您的应用程序有点复杂并且包含相当多的业务逻辑,那么根据此解决方案,您的 user.js 将会很大,您可能希望将真正的业务逻辑从模型层移动到服务层。