Mongoose核心概念——连接数据库

1,598 阅读3分钟

之前的文章以一个demo介绍了Mongoose的入门知识,本文深入Mongoose介绍它的核心概念——连接数据库。

调用 mongoose.connect() 可以让 Mongoose 与数据库实例建立连接,它有以下三种用法:

function connect(uri: string, options: ConnectOptions, callback: CallbackWithoutResult): void;

function connect(uri: string, callback: CallbackWithoutResult): void;

function connect(uri: string, options?: ConnectOptions): Promise<Mongoose>;

由于 Mongoose 在内部默认会缓冲 document 的调用,所以在连接数据库之前调用 document 上的方法,不会抛出任何错误,也就是说下面的代码能成功运行:

const Teacher = mongoose.model('teacher', teacherSchema);
const heyu = new Teacher({
    name: 'heyu',
    grade: 6,
    salary: 1000
})
// 操作会被挂起,直到 Mongoose 建立起与 MongoDB 的连接
heyu.save()

setTimeout(() => {
    connect()
}, 6000);

修改连接数据库时的默认行为

调用 mongoose.connect() 时给它传递 options 参数能修改连接数据库时的默认行为。以下是一些常用的配置项,访问 mongodb.github.io/node-mongod… 查看全部配置项。

  1. bufferCommands:接受布尔值,默认值为 true,当设置为 false 时将关闭 Mongoose 的缓冲机制。
  2. user/pass:用于身份验证的用户名和密码。
  3. autoIndex:接受布尔值,默认值为 true,当设置为 false 时 mongoose 不会自动构建在schema 中定义的索引。由于建立索引会导致性能下降,所以在大型的生产环境建议将 autoIndex 设置为 false 可能并不合适。
  4. dbName:指定要连接的数据库,这里的值将覆盖连接字符串中指定的数据库。

错误处理

Mongoose在与数据库建立连接期间发生的错误能分为如下两类:

(1)初始连接时发生错误。此时 Mongoose 将触发 error 事件,mongoose.connect() 返回一个rejected 的 promise 对象,Mongoose 不会自动重新连接。应该用 .catch() 或 try/catch 处理这类错误,代码如下:

mongoose.connect('mongodb://localhost:27017/school').
  catch(error => handleError(error));

  或者

try {
  await mongoose.connect('mongodb://localhost:27017/school');
} catch (error) {
  handleError(error);
}

(2)初始连接建立后发生错误。此时Mongoose将触发error事件,并尝试重新连接。应该监听error事件来处理这类错误,代码如下:

mongoose.connection.on('error', error => {
  handleError(error);
});

Connection 的事件

Connection 继承自 Node.js 的 EventEmitter,常用事件如下:

  1. connecting:当 Mongoose 开始与 MongoDB 建立初始连接时触发。
  2. connected:当 Mongoose 与 MongoDB 成功地建立初始连接时,或者当 Mongoose 与 MongoDB 断开连接又重新建立连接时触发,也就是说这个事件可能会触发多次。
  3. disconnecting:当调用 connection.close() 断开与 MongoDB 的连接时触发。
  4. disconnected:当 Mongoose 失去了与 MongoDB 的连接时触发。
  5. close:调用 connection.close() 成功地断开与 MongoDB 的连接时触发,调用 connection.close(),disconnected 和 close 事件都会被触发。
  6. reconnected:如果 Mongoose 失去了与 MongoDB 的连接并成功重新连接时触发该事件。
  7. error:Mongoose 与 MongoDB 建立连接发生错误时触发。

建立多个连接

到目前为止已经演示如何将 Mongoose 的默认连接连接到 MongoDB,此时调用的方法是mongoose.connect(),使用 mongoose.connection 能访问默认连接。如果你有多个数据库或者多个 MongoDB 集群,那么你需要建立多个与 MongoDB 的连接,此时用到的方法是mongoose.createConnection(),此方法接受与 mongoose.connect() 相同的参数并返回此次建立的连接。建立多个连接的示例代码如下:

(1)使用mongoose.createConnection建立连接

import mongoose from 'mongoose'
import teacherSchema from './teacherSchema.js'

const conn = mongoose.createConnection('mongodb://localhost:27017/heyu');

// 这里用 conn.model 代替 mongoose.model
conn.model('teacher', teacherSchema)

// 导出连接
export default conn

Model在不同的数据库连接间不能共用,但是Schema可以共用。

(2)实例化Model,并将创建的document保存到数据库

import heyuConnection from './heyuConnection.js'

await new heyuConnection.models['teacher']({
     name: '张三',
     grade: 2,
     salary: 1000
}).save()

heyuConnection.models 中保存了所有添加到此连接的 Model,与 Model 相关的操作必须访问由 mongoose.createConnection 返回的连接。

推荐阅读

  1. 在 macOS 上安装 MongoDB
  2. MongoDB 增删改查操作
  3. Mongoose 入门,从一个 demo 开始