Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js/Express.js:用于DB查询的工厂设计模式_Node.js_Express_Node Mysql - Fatal编程技术网

Node.js/Express.js:用于DB查询的工厂设计模式

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) {

我不熟悉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) {
        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我已经添加了一个答案,并以原型的形式解释了结构。谢谢你的帮助:)谢谢你的帮助:)