我的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
文件中的queries
与var mongoose
文件中authenticate
的引用相同吗?
如果没有,我怎样才能测试我是否需要首先进行猫鼬连接?
答案 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客户端。