我有一个非常简单的" server.js"设置我正在尝试运行:
var express = require('express'),
wines = require('./routes/testscripts');
var app = express();
app.get('/first_test', wines.popSingleData);
app.listen(3000);
console.log('Listening on port 3000...');
此设置为连接到localhost:3000
当我导航到localhost:3000/first_test
时,它会调用" popSingleData" testscript.js中的方法:
...
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
var db = mongoose.connection;
console.log('include called');
exports.popSingleData = function(req, res) {
// var mongoose = require('mongoose');
// mongoose.connect('mongodb://localhost/test');
// var db = mongoose.connection;
console.log('function called');
db.on('error', console.error.bind(console, 'connection error:'));
console.log('error handler set');
db.once('open', function callback () {
//yay!
console.log("DB Opened");
var someSchema = require('../models/someSchema');
someSchema.find(function (err, found){
if (err)
{
console.log('err');
}
if(found.length != 0)
{
console.log("Found Data:");
console.log(found);
for( var i = 0; i < found.length; i++)
{
res.jsonp((found[i]));
}
}
});
});
};
...
导致问题的行是第3个:
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
var db = mongoose.connection;
当在函数中声明它们时,脚本按预期运行,打印出它从数据库中找到的JSON对象。当它们在testscript.js中定义,但在方法范围之外时,程序会挂起db.once('open', function callback () {...}); command
。
有人可以了解移动这三行代码所带来的差异吗?每次我想要一个不同的函数来访问数据库时,我真的需要建立一个新的连接吗?
答案 0 :(得分:16)
如果您已连接到数据库,once
事件将不会再次触发。当全局连接(在函数外部)时,数据库已经连接整个NodeJs进程。
对mongoose.connect('mongodb://localhost/test');
的调用会建立连接并打开它。
因此,当NodeJs应用程序启动时,不要在每个函数调用上打开它(这将是一种与MongoDB交互的低效方式)connect
,并认为会有一段时间连接可能无法使用(因为它是异步的),或者在连接完成(或超时)之前不启动应用程序(listen
)。使用Mongoose,直到建立连接,所有命令都被缓冲(但这可能不是您想要的行为)。如果您想知道连接何时完成,可以使用open
事件。
如果您使用mongoose.connection
函数创建连接,则可在此处找到连接:connect
。
打开连接后,您可以在popSingleData
函数中使用它,而无需使用once
事件和回调。有自动维护的连接池。
有关连接的更多信息,请阅读here。