当前位置: 首页 > 知识库问答 >
问题:

使用Node连接MongoDB的最佳方式。js[重复]

薛高澹
2023-03-14

我读过一些关于如何将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不是一个函数服务器端。所以,我的问题是为什么上面的代码不起作用,如果第一个代码是一个好的替代方案,以及是否有任何其他方法可以做到这一点。

共有2个答案

姬国安
2023-03-14

我写了一篇关于如何在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);
            });
    };
};
柳宏深
2023-03-14

您可以使用全局变量来保持连接(例如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

  • 我正在创建一个多租户应用程序,在该应用程序中,我基于子域连接到该特定租户的数据库。 下面是执行此操作的代码: 这是连接数据库的最佳方式,还是存在任何问题,因为我是从性能的角度考虑的,因为每次连接数据库时都有不同的子域。最好的方法是什么?