Node.js/Express.js:用于DB查询的工厂设计模式
我不熟悉Node.js/Express.js,试图用它们构建一个基本网站 我使用节点mysql处理数据库查询,但现在我正在编写令人敬畏的代码,例如:Node.js/Express.js:用于DB查询的工厂设计模式,node.js,express,node-mysql,Node.js,Express,Node Mysql,我不熟悉Node.js/Express.js,试图用它们构建一个基本网站 我使用节点mysql处理数据库查询,但现在我正在编写令人敬畏的代码,例如: router.get('/', function(req, res, next) { var query = 'INSERT INTO users(token) VALUES (?)'; connection.query(query, [req.query.token], function(err, rows, fields) {
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);
}
});
});
'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);
}
});
}
'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);
};
'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.
}
'use strict';
module.exports.QueryFactory = function(){
var QueryMap = {
'InsertUserQuery': 'Insert into user(token) values(?)';
}
return function getQuery(QueryID){
return QueryMap[QueryID];
}
}
controller.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);
}
});
});
'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);
}
});
}
'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);
};
'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.
}
'use strict';
module.exports.QueryFactory = function(){
var QueryMap = {
'InsertUserQuery': 'Insert into user(token) values(?)';
}
return function getQuery(QueryID){
return QueryMap[QueryID];
}
}
user.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);
}
});
});
'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);
}
});
}
'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);
};
'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.
}
'use strict';
module.exports.QueryFactory = function(){
var QueryMap = {
'InsertUserQuery': 'Insert into user(token) values(?)';
}
return function getQuery(QueryID){
return QueryMap[QueryID];
}
}
userDao.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);
}
});
});
'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);
}
});
}
'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);
};
'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.
}
'use strict';
module.exports.QueryFactory = function(){
var QueryMap = {
'InsertUserQuery': 'Insert into user(token) values(?)';
}
return function getQuery(QueryID){
return QueryMap[QueryID];
}
}
queryFactory.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);
}
});
});
'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);
}
});
}
'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);
};
'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.
}
'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将非常大,您可能希望将真正的业务逻辑从模型层移动到服务层。在原型层,我尝试为您编写一小段存根。这段代码可能有一些错误,因为代码的思想是演示代码的分离并将其放置在适当的位置 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);
}
});
});
'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);
}
});
}
'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);
};
'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.
}
'use strict';
module.exports.QueryFactory = function(){
var QueryMap = {
'InsertUserQuery': 'Insert into user(token) values(?)';
}
return function getQuery(QueryID){
return QueryMap[QueryID];
}
}
controller.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);
}
});
});
'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);
}
});
}
'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);
};
'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.
}
'use strict';
module.exports.QueryFactory = function(){
var QueryMap = {
'InsertUserQuery': 'Insert into user(token) values(?)';
}
return function getQuery(QueryID){
return QueryMap[QueryID];
}
}
user.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);
}
});
});
'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);
}
});
}
'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);
};
'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.
}
'use strict';
module.exports.QueryFactory = function(){
var QueryMap = {
'InsertUserQuery': 'Insert into user(token) values(?)';
}
return function getQuery(QueryID){
return QueryMap[QueryID];
}
}
userDao.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);
}
});
});
'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);
}
});
}
'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);
};
'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.
}
'use strict';
module.exports.QueryFactory = function(){
var QueryMap = {
'InsertUserQuery': 'Insert into user(token) values(?)';
}
return function getQuery(QueryID){
return QueryMap[QueryID];
}
}
queryFactory.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);
}
});
});
'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);
}
});
}
'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);
};
'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.
}
'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将很大,您可能希望将实际业务逻辑从模型层移动到服务层。使用DAO与数据库进行交互。它将把你的应用程序与数据库隔离开来,所以如果数据库随时发生变化,你就不必改变整个应用程序。换刀就行了@GauravGupta这就是我想要做的,我正在寻找在node中实现这种模式的好方法。js@lggY我已经添加了一个答案,并以原型格式解释了结构。使用DAO与数据库交互。它将把你的应用程序与数据库隔离开来,所以如果数据库随时发生变化,你就不必改变整个应用程序。换刀就行了@GauravGupta这就是我想要做的,我正在寻找在node中实现这种模式的好方法。js@lggY我已经添加了一个答案,并以原型的形式解释了结构。谢谢你的帮助:)谢谢你的帮助:)