一尘不染

使用Node.js连接到MongoDB的最佳方法

node.js

我已经阅读了一些有关如何将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 is not afunction服务器端收到错误消息。因此,我的问题是,如果第一个代码是一个不错的选择,以及是否还有其他方法可以实现上述代码,那么为什么上述代码不起作用。


阅读 213

收藏
2020-07-07

共1个答案

一尘不染

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

或者,如果您愿意,也可以使用 Promise对象 ,该 对象MongoClient没有回调参数的情况下被调用返回:

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粗箭头功能定义

您绝对不应该MongoClient每次都打电话。使用全局变量或Promises允许MongoDB
node.js驱动程序创建连接池,该连接池至少可以实现两个优点:

  • 连接在池中被重用,因此在应用程序的生命周期内没有多个昂贵的设置/拆卸过程。您只需连接一次,然后让驾驶员为您照顾其余的一切。
  • 您可以通过限制连接池的大小来控制应用程序与数据库的连接量。

编辑2018-08-24
MongoClient.connect()node.js驱动程序3.0及更高版本中的方法返回客户端对象而不是数据库对象。修改了以上示例,以使其与最新的node.js驱动程序版本保持最新。

2020-07-07