尝试通过Node.js连接MongoDB

在继续「在CentOS7上安装MongoDB〜启动MongoDB〜启动mongoShell」之后,我想尝试从Node.js连接到MongoDB。CentOS7在Vagrant+VirtualBox上启动,版本为MongoDB 3.4.10,Node.js版本为9.2.0。
我们将参考MongoDB NodeJS驱动进行操作。

准备node项目

由于/vagrant目录已经同步到了共享文件夹中,所以我会在其中创建一个名为mongolesson的目录,并进行操作。同时,我也会创建一个名为app.js的文件来编写处理程序。

$ cd /vagrant
$ mkdir mongolesson
$ cd mongolesson
$ npm init -y
$ touch app.js
$ ls
app.js package.json

我准备好了。

使用MongoDB NodeJS驱动程序来安装

暫時只需要安裝 MongoDB 的驅動程式,不過也會順便安裝 ESLint。

$ npm install mongodb esLint

在连接MongoDB之前

MongoDB服务器必须已经启动,并且数据库目录已经创建。只要使用mongo命令启动shell即可。

$ mongo
MongoDB shell version v3.4.10
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.10
...

记下在这种情况下出现的mongodb://127.0.0.1:27017。

连接到MongoDB

我将编写一个用于连接MongoDB的JavaScript文件。基本上就是按照文档的要求来写。
MongoClient.connect(url, [option], [callback])的第一个参数是传入的URL,我在启动mongo shell时记下的,将数据库名称附加在URL后面。即使没有创建数据库也没有问题。另外,默认设置是将127.0.0.1分配给localhost,所以URL也可以是mongodb://localhost:27017/myDB。
assert模块通常用于编写单元测试时,用来确认没有发生错误。

const mongodb = require('mongodb')
const MongoClient = mongodb.MongoClient
const assert = require('assert')

MongoClient.connect('mongodb://127.0.0.1:27017/myDB', (err, db) => {
    assert.equal(null, err)
    console.log("Connected successfully to server")
    db.close()
})

我会试一试。

$ node app.js
Connected successfully to server

如果能够达到这样的情况,那就是成功了。

让我们尝试插入一下。

在app.js中添加一个执行插入操作的函数。

const mongodb = require('mongodb')
const MongoClient = mongodb.MongoClient
const assert = require('assert')

MongoClient.connect('mongodb://localhost:27017/myDB', (err, db) => {
    assert.equal(null, err)
    console.log("Connected successfully to server")
    insertDocuments(db, () => {
        db.close()
    })
})

const insertDocuments = (db, callback) => {
    const documents = [
        { a: 1 },
        { a: 2 },
        { a: 3 }
    ]
    // myDBデータベースのdocumentsコレクションに対して
    // ドキュメントを3つ追加します
    db.collection('documents').insertMany(documents, (err, result) => {
        // insert結果の確認
        assert.equal(err, null)
        assert.equal(3, result.result.n)
        assert.equal(3, result.ops.length)

        console.log("Inserted 3 documents into the collection")
        callback(result)
    })
}

我将尝试执行。

$ node app.js
Connected successfully to server
Inserted 3 documents into the collection

因为似乎成功了,所以我会在Mongo shell中确认一下。

$ mongo
...

> use myDB
switched to db myDB
> show collections
documents
> db.documents.find()
{ "_id" : ObjectId("5a13aa733c67677b0a26437b"), "a" : 1 }
{ "_id" : ObjectId("5a13aa733c67677b0a26437c"), "a" : 2 }
{ "_id" : ObjectId("5a13aa733c67677b0a26437d"), "a" : 3 }

我的数据库“myDB”尚未创建,但已经自动创建了。另外,还创建了一个名为“documents”的集合,并添加了三个文档。

使用ES6连接MongoDB

在快速启动中,我们在MongoClient.connect()函数中连接MongoDB并调用insert等操作。这样做是可以的,但是我们也可以利用MongoClient.connect()返回的Promise来进行操作。在MongoClient的文档中,有如下使用co库的代码。

const mongodb = require('mongodb')
const MongoClient = mongodb.MongoClient
const co = require('co')
const assert = require('assert')

co(function* () {
    const db = yield MongoClient.connect('mongodb://localhost:27017/myDB')
    console.log("Connected successfully to server")
    db.close()
}).catch(err => {
    console.log(err.stack);
})

当尝试执行时

$ node app.js
Connected successfully to server

可能的中文翻译:
可以。如果Node的版本过旧,可能会导致错误。虽然这样也可以,但是因为不太了解co的用法或者Generator,所以想尝试用普通的then和catch串联的写法。

const mongodb = require('mongodb')
const MongoClient = mongodb.MongoClient

MongoClient.connect('mongodb://localhost:27017/myDB').then(db => {
    console.log("Connected successfully to server")
    db.close()
}).catch(err => {
    console.log(err)
})
$ node app.js
Connected successfully to server

我可以去。我也试试insert。

我可以去。我也尝试一下insert。

const mongodb = require('mongodb')
const MongoClient = mongodb.MongoClient
const assert = require('assert')

MongoClient.connect('mongodb://localhost:27017/myDB').then(db => {
    db.collection('documents').insertMany([
        { b: 1 },
        { b: 2 },
        { b: 3 }
    ], (err, result) => {
        assert.equal(err, null)
        assert.equal(3, result.result.n)
        assert.equal(3, result.ops.length)
        console.log("Inserted 3 documents into the collection")
    })
    db.close()
}).catch(err => {
    console.log(err)
})
$ node app_es6.js 
Inserted 3 documents into the collection
$ mongo
...

> use myDB
> db.documents.find()
{ "_id" : ObjectId("5a13aa733c67677b0a26437b"), "a" : 1 }
{ "_id" : ObjectId("5a13aa733c67677b0a26437c"), "a" : 2 }
{ "_id" : ObjectId("5a13aa733c67677b0a26437d"), "a" : 3 }
{ "_id" : ObjectId("5a13b378f8ce107b7021881e"), "b" : 1 }
{ "_id" : ObjectId("5a13b378f8ce107b7021881f"), "b" : 2 }
{ "_id" : ObjectId("5a13b378f8ce107b70218820"), "b" : 3 }

我理解了。我们也可以使用Promise来编写。下一步,我想要尝试将其实际嵌入应用程序中。

广告
将在 10 秒后关闭
bannerAds