大家好,我是王嗨皮,一名主业前端,副业全栈的程序员,在这里我会分享关于前端进阶全栈的常用技术 和 基本入门操作。 如果我的文章能让您有所收获,欢迎一键三连(评论,点赞,关注)。
本节内容,我们通过 mongoose 定义好数据模型,并实现对数据库增、删、改、查基本的操作。
定义数据模型
在项目根录下创建两个文件夹,分别命名为 modal 和 router,
其中 modal 文件夹下新建 modal.js 文件用来定义数据模型,router 文件夹下新建 router.js 文件方便后续创建增、删、改、查请求接口。
项目结构
📦node_mongo
┣ 📂model
┃ ┗ 📜modal.js
┣ 📂router
┃ ┗ 📜router.js
┣ 📜.env
┣ 📜index.js
┗ 📜package.json
接下来,首先在 modal.js 中建立 Schema 数据文档。
Schema 是什么? 它类似于传统数据库中的表结构,定义了集合里每个文档中应该有的字段,以及这些字段的数据类型。
modal.js
// 导入mongoose
import mongoose from 'mongoose'
// 创建Schema文档
const carSchema = new mongoose.Schema({
type: String,
brand: String,
price: Number,
})
// 导出模型
export const carModel = mongoose.model('car', carSchema)
上述代码中,第一步先将 mongoose 核心依赖库导入。
其次以汽车为例,创建一个 carSchema 的实例对象,对象中包含 type、brand、price 三个字段,分别代表型号,品牌和价格,其中前两个为数据类型为String(字符串),价格的数据类型为Number(数字)
最后,使用 mongoose.model 将数据模型导出,方便接口的使用,mongoose.model 接收两个参数。
第一个参数 car 是MongoDB数据库下集合的名称(注意:集合创建时会名称自动修改为复数,比如代码中传递参数为 car,数据库集合的名称会变为 cars)
第二个参数是 carSchema,就是之前创建的文档实例对象。
常用接口的创建
完成数据模型的定义后,我们来到 router 文件夹下,
首先创建一个 asyncHandler.js ,并定义一个简单的错误处理包装函数,统一处理错误格式。
asyncHandler.js
// 异步错误处理包装函数
export const asyncHandler = (fn) => {
return (req, res, next) => {
Promise.resolve(fn(req, res, next)).catch((error) => {
console.error('错误:', error.message)
// 统一返回错误格式
res.status(500).json({
success: false,
message: error.message || '服务器错误'
})
})
}
}
之后把数据模型 carModel 和 异步处理函数 asyncHandler.js 导入 router.js。
router.js
import express from 'express'
const router = express.Router()
// 导入model
import { carModel } from '../model/modal.js'
// 导入错误处理包装函数
import { asyncHandler } from './asyncHandler.js'
接下来我们使用 Restful API 分别按顺序创建增、删、改、查四个接口并将路由导出,完整代码如下:
router.js
// 新增汽车数据
router.post('/addCars', asyncHandler(async (req, res) => {
const { type, brand, price } = req.body
const car = new carModel({ type, brand, price })
await car.save()
res.json(car)
}))
// 删除汽车数据
router.delete('/deleteCars/:id', asyncHandler(async (req, res) => {
//获取删除id
const { id } = req.params
await carModel.findByIdAndDelete(id)
res.json({ message: '数据删除成功!' })
}))
// 更新汽车数据
router.put('/updateCars/:id', asyncHandler(async (req, res) => {
//获取更新数据id
const { id } = req.params
const { type, brand, price } = req.body
const car = await carModel.findByIdAndUpdate(id, { type, brand, price }, { new: true })
res.json(car)
}))
// 查询所有汽车数据
router.get('/getAllCars', asyncHandler(async (req, res) => {
const cars = await carModel.find()
res.json(cars)
}))
// 导出路由
export default router
接口测试
最后,我们使用 Apifox 来测试一下接口和数据库是否正常运行。
先在项目根目录 index.js 里导入接口路由。
index.js
// 导入路由
import router from './router/router.js'
// 将api设置为公共路径,不用每次都在路由前面加/api
app.use('/api', router)
使用终端进入项目根目录,执行 node index.js 启动服务。
我们以新增一条汽车数据接口为例,请求地址和传递参数参考下图:

点击 "发送" 请求,如果添加成功,我们可以在下方控制台看到返回的数据。

为了确认数据添加成功,可以使用 Navicat 登录数据库查看一下。

从上图可以看到在 test 数据库下已经成功建立了 cars 集合,并且有了一条数据。其它的接口大家可以自行进行测试。
到此,我们完成了使用 Mongoose 实现对数据库增删改查的基本操作。
下一节,我们将讲解聚合、条件查询、分页 排序等 Mongoose 对数据库的进阶操作。
如果我的文章能让您有所收获,欢迎一键三连(评论,点赞,关注),感谢!