1.0 前言

Mysql 用对应的 ORM 框架, 那 MongoDB 一样有对应的 ORM 框架,在 Node.js 中 MongoDB 对应的 ORM 框架,我们一般用 Mongoose,对应文档是 Mongoose 文档,这节我们一起学习下 Mongoose 基本使用。

2.0 Mongoose 基本使用

2.0.1 安装

  1. npm install mongoose --save

2.0.2 创建 Mongoose 实例

一样,我们还是在 db.js 里做初始化mongoose。

  1. //app/db/mongodb.js
  2. const mongoose = require('mongoose')
  3. const { mongodb } = require('../config')
  4. const { logger } = require('../log4j/logger')
  5. const { port, host, pass, userName, database, authSource = 'admin', poolSize = 40 } = mongodb
  6. let connection
  7. /**
  8. * 这里我们初始化数据库连接
  9. */
  10. async function initDB() {
  11. let mongoUrl
  12. if (userName && pass) {
  13. mongoUrl = `mongodb://${userName}:${pass}@${host}:${port}?authSource=${authSource}`
  14. } else {
  15. mongoUrl = `mongodb://${host}:${port}`
  16. }
  17. const mongooseDB = await mongoose.connect(mongoUrl, {poolSize: poolSize,dbName: database})
  18. connection = mongooseDB.connection
  19. }
  20. initDB()
  21. function getConnection() {
  22. return connection
  23. }
  24. module.exports = {
  25. initDB,
  26. getConnection,
  27. }

数据库初始化完成,接下来我们定义Model。

2.0.3 Model 定义

model 定义就是来描述数据库字段和我们对象间的映射关系。

  1. // app/models/user.js
  2. const Mongoose = require('mongoose')
  3. const userSchema = new Mongoose.Schema(
  4. {
  5. name: {
  6. type: String,
  7. required: true,
  8. },
  9. email: {
  10. type: String,
  11. required: true,
  12. },
  13. imgUrl: {
  14. type: String,
  15. required: true,
  16. }
  17. },
  18. {timestamps: true}
  19. );
  20. Mongoose.model('User', userSchema);
  21. module.exports = Mongoose.model('User');

Mogoose 是通过 Schema 格式来描述的,因为 MongoDB 存都是 JSON 类型的数据,最好还是定义一套 Schema ,这样我们就能自动去校验数据的格式,是否缺少字段,这样能很好保证程序的健壮性。

2.0.4 使用 Model

接下来,我们改造下 controller 。

  1. const User = require('../models/user')
  2. async function list(ctx) {
  3. const data = await User.find({})
  4. console.log(data)
  5. ctx.body = {
  6. data: data.map(ele => ({...ele._doc, id: ele._id})),
  7. success: true
  8. }
  9. }
  10. async function detail(ctx) {
  11. const id = ctx.params.id
  12. const data = await User.findById(id)
  13. ctx.body = {
  14. data: data,
  15. success: true
  16. }
  17. }
  18. async function add(ctx) {
  19. const { path } = ctx.request.files.file
  20. const { name, email } = ctx.request.body // 获取 request body 字段
  21. const imgUrl = path.split("/static")[1]
  22. const user = new User({ name, email, imgUrl })
  23. const data = await user.save()
  24. ctx.body = {
  25. data: data,
  26. success: true,
  27. }
  28. }
  29. module.exports = {
  30. detail,
  31. list,
  32. add
  33. }

可以看到 add 方法里面,我们完全是操作 User 这个 Model 来控制数据库字段,假设现在 name 为 null ,就会报下面错误:
image.png
所以这种对 Model 定义,能很好的保证数据入库之前的校验,同时也大大减少后续对数据的残缺处理。

3.0 小结

这节主要讲 MongoDB 对应的 ORM 框架 Mogoose 的基本使用,这个在日常工作中也非常常见,可以对着Demo 看看源代码,Demo 地址