1.0 前言
Mysql 用对应的 ORM 框架, 那 MongoDB 一样有对应的 ORM 框架,在 Node.js 中 MongoDB 对应的 ORM 框架,我们一般用 Mongoose,对应文档是 Mongoose 文档,这节我们一起学习下 Mongoose 基本使用。
2.0 Mongoose 基本使用
2.0.1 安装
npm install mongoose --save
2.0.2 创建 Mongoose 实例
一样,我们还是在 db.js 里做初始化mongoose。
//app/db/mongodb.js
const mongoose = require('mongoose')
const { mongodb } = require('../config')
const { logger } = require('../log4j/logger')
const { port, host, pass, userName, database, authSource = 'admin', poolSize = 40 } = mongodb
let connection
/**
* 这里我们初始化数据库连接
*/
async function initDB() {
let mongoUrl
if (userName && pass) {
mongoUrl = `mongodb://${userName}:${pass}@${host}:${port}?authSource=${authSource}`
} else {
mongoUrl = `mongodb://${host}:${port}`
}
const mongooseDB = await mongoose.connect(mongoUrl, {poolSize: poolSize,dbName: database})
connection = mongooseDB.connection
}
initDB()
function getConnection() {
return connection
}
module.exports = {
initDB,
getConnection,
}
2.0.3 Model 定义
model 定义就是来描述数据库字段和我们对象间的映射关系。
// app/models/user.js
const Mongoose = require('mongoose')
const userSchema = new Mongoose.Schema(
{
name: {
type: String,
required: true,
},
email: {
type: String,
required: true,
},
imgUrl: {
type: String,
required: true,
}
},
{timestamps: true}
);
Mongoose.model('User', userSchema);
module.exports = Mongoose.model('User');
Mogoose 是通过 Schema 格式来描述的,因为 MongoDB 存都是 JSON 类型的数据,最好还是定义一套 Schema ,这样我们就能自动去校验数据的格式,是否缺少字段,这样能很好保证程序的健壮性。
2.0.4 使用 Model
接下来,我们改造下 controller 。
const User = require('../models/user')
async function list(ctx) {
const data = await User.find({})
console.log(data)
ctx.body = {
data: data.map(ele => ({...ele._doc, id: ele._id})),
success: true
}
}
async function detail(ctx) {
const id = ctx.params.id
const data = await User.findById(id)
ctx.body = {
data: data,
success: true
}
}
async function add(ctx) {
const { path } = ctx.request.files.file
const { name, email } = ctx.request.body // 获取 request body 字段
const imgUrl = path.split("/static")[1]
const user = new User({ name, email, imgUrl })
const data = await user.save()
ctx.body = {
data: data,
success: true,
}
}
module.exports = {
detail,
list,
add
}
可以看到 add 方法里面,我们完全是操作 User 这个 Model 来控制数据库字段,假设现在 name 为 null ,就会报下面错误:
所以这种对 Model 定义,能很好的保证数据入库之前的校验,同时也大大减少后续对数据的残缺处理。
3.0 小结
这节主要讲 MongoDB 对应的 ORM 框架 Mogoose 的基本使用,这个在日常工作中也非常常见,可以对着Demo 看看源代码,Demo 地址。