我读过一些关于如何将Mongo与Node一起使用的指南,它们似乎都以不同的方式连接到数据库。对我来说很有效的一种特殊方式是:
MongoClient.connect("mongodb://localhost:27017/exampleDb", function(err, db) {
if(err) { return console.dir(err); }
db.createCollection('users', function(err, collection) {});
//Do all server/database operations in here
});
然而,这对我来说似乎是低效/奇怪的,每次有app.get()
时,我都必须重新连接到数据库,例如创建新用户或检索信息。
另一种似乎更适合我的方式是
var mongoose = require("mongoose")
var db = mongoose.connect("localhost:27107/users");
db.createCollection('users', function(err, collection) {});
我见过几个网站按照这些思路做了一些事情,但我个人无法让上面的工作。我一直收到错误TypeError:db.createCollection不是一个函数
服务器端。所以,我的问题是为什么上面的代码不起作用,如果第一个代码是一个好的替代方案,以及是否有任何其他方法可以做到这一点。
我写了一篇关于如何在express中重用mongodb连接的教程。你可以在这里看到。基本上,它是一个简单的模块,可以与expressjs一起使用,如下所示:
var connection = require('./dbconnection');
// url and optional config.
app.use(connection(app, 'mongourl', {});
这是连接的代码:
module.exports = function(app, uri, opts) {
if (typeof uri !== 'string') {
throw new TypeError('Error: Unexpected mongodb connection url');
}
opts = opts || {};
var property = opts.property || 'db';
var connection;
return function expressMongoDb(req, res, next) {
if (!connection) {
connection = MongoClient.connect(uri, opts);
}
connection
.then(function (db) {
req[property] = db;
app.set('mongodb', db);
next();
})
.catch(function (err) {
connection = undefined;
next(err);
});
};
};
您可以使用全局变量来保持连接(例如db
),例如:
var db = null // global variable to hold the connection
MongoClient.connect('mongodb://localhost:27017/', function(err, client) {
if(err) { console.error(err) }
db = client.db('test') // once connected, assign the connection to the global variable
})
app.get('/', function(req, res) {
db.collection('test').find({}).toArray(function(err, docs) {
if(err) { console.error(err) }
res.send(JSON.stringify(docs))
})
})
或者,如果您愿意,您也可以使用MongoClient
返回的Promise对象,如果它在没有回调参数的情况下被调用:
var conn = MongoClient.connect('mongodb://localhost:27017/') // returns a Promise
app.get('/', function(req, res) {
conn.then(client=> client.db('test').collection('test').find({}).toArray(function(err, docs) {
if(err) { console.error(err) }
res.send(JSON.stringify(docs))
}))
})
请注意,我在第二个示例中使用了ES6 fat arrow函数定义。
您绝对正确,不应该每次都调用MongoClient
。使用全局变量或promise允许MongoDB节点。js驱动程序创建一个连接池,至少可以实现两个好处:
编辑2018-08-24:TheMongoClient。connect()
节点中的方法。js驱动程序版本3.0及更新版本返回一个客户机对象,而不是数据库对象。对上面的示例进行了修改,以使其与最新节点保持同步。js驱动程序版本。
问题内容: 我已经阅读了一些有关如何将Mongo与Node结合使用的指南,它们似乎都以不同的方式连接到数据库。一种对我有效的特定方式是: 但是,这对我来说似乎效率低下/很奇怪,每当出现时,我就不得不重新连接到数据库,例如用于创建新用户或检索信息。 似乎更适合我的另一种方法是 我已经看到有几个网站可以按照这些方式进行操作,但是我个人无法满足上述要求。我一直在服务器端收到错误消息。因此,我的问题是,如
问题内容: 当我的MongoDB连接空闲几分钟后,下一个请求将错误结束。从命令行客户端,它看起来像这样: 我看到针对MongoHQ和MongoLab的沙箱实例的问题。 由于重新连接,下一个请求通过正常。这是我的网络应用程序中的一个问题,因为几分钟不活动后,在网络请求期间将出现此错误。有两件事让我感到惊讶: MongoDB连接被如此频繁和频繁地破坏,并且 驱动程序只是引发一个异常,而不是在重新连接后
我正在尝试将我的节点应用程序连接到mongo集群,我已经使用了这种方法 但它会抛出这个错误 (节点:8701)UnhandledPromiseRejectionWarning:未处理得承诺拒绝(拒绝ID:2):MongoError:拓扑已被破坏(节点:8701)[DEP0018]DeprecationWarning:不推荐未处理得承诺拒绝.将来,如果re未被处理,则承诺拒绝将使用非零退出代码终止n
问题内容: 目前,我们正在使用带有8gb RAM的4个cpu窗口框,并在同一框上安装了MySQL5.x。我们正在为应用程序使用Weblogic应用程序服务器。我们的应用程序目标是200个并发用户(显然不是同一模块/屏幕)。那么,我们应该在连接池中配置的最佳连接数是多少(最小和最大数)(我们正在使用weblogic AS的连接池机制)? 问题答案: 这个问题有一个非常简单的答案: 连接池中的连接数应
使用 Qt 框架实现切换按钮的最佳方法是什么? 编辑: 我知道的唯一可能性是。根据Qt文档,允许具有开/关行为。如何使其如下所示?知道我使用 Qt 5.1.1
我正在创建一个多租户应用程序,在该应用程序中,我基于子域连接到该特定租户的数据库。 下面是执行此操作的代码: 这是连接数据库的最佳方式,还是存在任何问题,因为我是从性能的角度考虑的,因为每次连接数据库时都有不同的子域。最好的方法是什么?