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 将会很大,您可能希望将真正的业务逻辑从模型层移动到服务层。