Node.js如何处理相同的代码需要单独的文件?

时间:2013-09-05 21:27:38

标签: node.js mongoose

我的Node.js服务器代码变得笨拙且冗长,所以我最近开始将函数重构为单独的.js文件并通过requires引入它们。例如:

//server.js
var queries = require('./routes/queries');
var authenticate = require('./routes/authenticate');
...

//queries.js
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
exports.SomeFunctionB = ...
...

//authenticate.js
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
exports.SomeFunctionA = ...
...

但是,现在每当我运行我的代码时,Mongoose.connect都会出现关于尝试打开未关闭连接的错误。我知道这是因为我在两个JS文件中都调用了mongoose.connect

由于我知道Server.js,实际运行的Node.js文件,queries.js之前需要 s authenticate.js,我可以简单地省略第二个mongoose.connect

也许更具体地说,var mongoose文件中的queriesvar mongoose文件中authenticate的引用相同吗?

如果没有,我怎样才能测试我是否需要首先进行猫鼬连接?

1 个答案:

答案 0 :(得分:0)

我不确定monogoose是否有API方法。但是,我认为你不应该尝试连接不同的文件。你为什么不这样做一次。在你的主文件里面。我不知道您是否使用任何框架,但您可以将mongoose对象附加到请求并将其传递给您的所有文件。这是一个使用mongodb本机驱动程序的示例,但这个想法很好地说明了:

MongoClient.connect('...', function(err, db) {
    if(err) {
        console.log('Sorry, there is no mongo db server running.');
    } else {
        var attachDB = function(req, res, next) {
            req.db = db;
            next();
        };
        app.all('/admin*', attachDB, function(req, res, next) {
            // run your constroller here
        });         
        app.all('/blog/:id', attachDB, function(req, res, next) {
            // run your constroller here
        });
        app.all('/', attachDB, function(req, res, next) {
            // run your constroller here
        });     
        http.createServer(app).listen(config.port, function() {
            console.log(
                'Successfully connected to mongodb://' + config.mongo.host + ':' + config.mongo.port,
                '\nExpress server listening on port ' + config.port
            );
        });
    }
});

因此,attachDB实际上是一个修补请求对象的中间件。一旦该对象被传递给下一个中间件,它就可以访问mongodb客户端。