Node.js / Express.js:DB查询的工厂devise模式

我是Node.js / Express.js的新手,试图build立一个基本的网站。

我用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个不同的路线,其中每个查询都是硬编码的。

我想能够build立数据库工厂,所以我的代码如下所示:

 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]; } } 

注意

我认为这种解决scheme最适合中等规模应用。 由于代码的分离可以通过多种方式来完成,所以它们是对这个问题的解决scheme。

如果您的应用程序有点复杂并且包含大量的业务逻辑,那么根据这个解决scheme,您的user.js将会很大,您可能希望将实际的业务逻辑从Model转换到Service层。