我目前正在从猫鼬回滚到node-mongodb-native。
所以我对这个话题很陌生。但是,我目前的问题是想在服务器启动时创建一个数据库集合,然后我可以通过应用程序使用它。不幸的是,我只在存储库中找到示例,其中您只能直接在连接函数的回调中执行数据库操作。
文档:
var mongodb = require("mongodb"),
mongoServer = new mongodb.Server('localhost', 27017),
dbConnector = new mongodb.Db('example', mongoServer);
db_connector.open(function(err, db) {
if (err) throw new Error(err);
// here I can do my queries etc.
});
但是,当我在某些路由回调中时,如何访问回调中的数据库对象?目前我唯一的想法是将应用程序包装到回调中:
var mongodb = require("mongodb"),
express = require("express"),
mongoServer = new mongodb.Server('localhost', 27017),
dbConnector = new mongodb.Db('example', mongoServer);
var app = new express();
db_connector.open(function(err, db) {
if (err) throw new Error(err);
app.get('/products', function(req, res, next) {
db.collection('products', function(err, collection) {
if (err) next(new Error(err));
collection.find({}, function(err, products) {
res.send(products);
});
});
});
});
但我不认为这是它应该的方式吗?
有没有办法创建一个同步数据库连接调用,然后我可以轻松地通过整个应用程序使用它,就像猫鼬一样?
问候博多
Db.open 打开与 mongodb 的连接并返回对自身的引用。源代码请参见此处:https://github.com/mongodb/node-mongodb-native/blob/master/lib/mongodb/db.js#L245
您想要的只是推迟启动您的快速应用程序,侦听其端口并接收请求,直到您与 mongodb 建立连接。
所以你可以做的是:
var mongodb = require("mongodb"),
express = require("express"),
mongoServer = new mongodb.Server('localhost', 27017),
dbConnector = new mongodb.Db('example', mongoServer),
db;
var app = new express();
app.get('/products', function(req, res, next) {
db.collection('products', function(err, collection) {
if (err) next(new Error(err));
collection.find({}, function(err, products) {
res.send(products);
});
});
});
db_connector.open(function(err, opendb) {
if (err) throw new Error(err);
db = opendb;
app.listen(3000);
});
不过,我不确定这是否是一个好主意。如果连接中断或重新启动 mongodb 进程,此解决方案不允许您重新创建连接。因此,虽然上述方法可能有效,但创建一种方法来包装与mongodb连接的创建可能是一个更好的主意。