0

我的 Node.js 服务器代码变得笨重且冗长,因此我最近开始将函数重构为单独的 .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 都会吐出一个关于尝试打开未关闭连接的错误。我知道这是因为我同时调用mongoose.connect了两个 JS 文件。

既然我知道,Server.js实际运行的 Node.js 文件需要s queries.jsbefore authenticate.js,我可以简单地省略第二个mongoose.connect吗?

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

如果没有,我如何测试我是否需要首先建立猫鼬连接?

4

1 回答 1

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 客户端。

于 2013-09-05T21:52:37.280 回答