一、基本结构
❝这个是我个人比较喜欢的结构
❞
server.js为主要运行文件
public为前端打包好的文件 最终会在serverJs读取
routers里的为对数据库的增删改 ,最终导出引入到server.js
models为对集合的初始化文档结构,最终导出引入到routers对集合进行操作
二、基本连接
首先我们连接之前 需要打开mongoDb服务,以及在终端下载Express和monngose驱动库且引入
//server.js
const mongoose = require('mongoose')
const express = require('express')
const app = express() // 产生应用对象
//会在本地创建一个reactAntd库,默认端口号我们随mongodb27017定义
mongoose.connect('mongodb://localhost:27017/reactAntd', {useNewUrlParser: true})
.then(() => {
console.log('连接数据库成功!!!')
//只有当连接上数据库后才去启动服务器
app.listen('5000', () => {
console.log('服务器启动成功, 请访问: http://localhost:5000')
})
})
//监听连接错误的话
.catch(error => {
console.error('连接数据库失败', error)
})
❝然后终端运行 node server.js
❞
useNewUrlParser 这个mongoDB4.0之后就需要加上加上,4.0以前的可以不加
然后运行文件就会启动http://localhost:5000 当然这时候没有任何作用,仅仅表示连接服务器成功
二、对集合进行文档结构初始化
❝models>ProductModel.js 中每一个集合代表一个js文件表示不同的业务逻辑 我们就取一个来说
❞
// 1.引入mongoose
const mongoose = require('mongoose')
// 2.字义Schema(描述文档结构,用来对他接受的值进行类型校验以及初始值,以后可有ts普及起来会比较少用了)
const productSchema = new mongoose.Schema({
// type类型 required必选 default默认值
categoryId: {type: String, required: true}, // 定义分类的id,接收类型为字符串且必须传入
pCategoryId: {type: String, required: true},
name: {type: String, required: true}, // 名称
price: {type: Number, required: true}, // 价格
desc: {type: String},
status: {type: Number, default: 1}, // 定义商品状态,接收类型为数字且默认值为1
imgs: {type: Array, default: []}, // 定义图片列表,接收类型为数组且默认值为空数组
detail: {type: String}
})
// 3. 定义Model(与集合对应, 可以操作集合)
const ProductModel = mongoose.model('products', productSchema)
// 4. 向外暴露Model 会在routes中引入
module.exports = ProductModel
❝❞
三、进行对数据库的操作
❝routes>index.js 我们将models的集合引入到这里 进行路由配置数据库的增删改查;
❞
请看下列栗子,了解怎么使用即可
const express = require('express')
const ProductModel = require('../models/ProductModel') //引入刚才初始化好的集合
const router = express.Router()// 得到路由器对象
❝添加 db.create()
❞
//添加产品
router.post('/manage/product/add', (req, res) => {
const product = req.body
ProductModel.create(product) //添加产品
.then(product => {
res.send({status: 0, data: product})//返回HTTP响应
})
.catch(error => {
console.error('添加产品异常', error)
res.send({status: 1, msg: '添加产品异常, 请重新尝试'}))//返回HTTP响应
})
})
❝删除 db.deleteMany() 删除全部
❞
db.deleteOne() 删除一个
router.post('/manage/product/delete', (req, res) => {
const {userId} = req.body
UserModel.deleteOne({_id: userId}) //根据传入的_id 删除指定产品
.then((doc) => {
res.send({status: 0})//HTTP响应
})
})
❝修改(更新) db.update()修改数据 不返回最新改好的数据
❞
db.findOneAndUpdate() 修改且获取修改好的数据
router.post('/manage/product/update', (req, res) => {
const product = req.body
ProductModel.findOneAndUpdate({_id: product._id}, product)//获得到产品id和产品数据结构
.then(oldProduct => {
res.send({status: 0})
})
.catch(error => {
console.error('更新商品异常', error)
res.send({status: 1, msg: '更新商品名称异常, 请重新尝试'})
})
})
❝查询 find()综合查询,传空获取所有
❞
findOne()只返回单个文档
findById()根据Id查询返回单个文档
router.get('/manage/manage/list', (req, res) => {
const {userId} = req.body
UserModel.findOne({_id: userId}})
.then(roles => {
res.send({status: 0, data: { roles}})
})
.catch(error => {
console.error('获取产品异常', error)
res.send({status: 1, msg: '获取产品异常, 请重新尝试'})
})
})
❝最后将路由导出,在server.js引入
❞
//将路由对象导出
module.exports = router
四、完成(^▽^)
❝原先我们只在server.js开启了服务器,现在我们将原先弄好的路由引入
❞
以及读取前端打包好的文件 public
const mongoose = require('mongoose')
const express = require('express')
const app = express() // 产生应用对象
// 声明使用静态中间件 读取客户端的包
app.use(express.static('public'))
// 解析post的请求↓↓↓↓↓↓
app.use(express.urlencoded({extended: true})) // 解析req.body 请求体参数是: name=tom&pwd=123
app.use(express.json()) // 请求体参数是json结构: {name: tom, pwd: 123}
// 声明使用解析cookie数据的中间件
const cookieParser = require('cookie-parser')
app.use(cookieParser())
const indexRouter = require('./routers')//使用路由器中间件也就是 routers的index
app.use('/', indexRouter) //读取路由接口模块
const fs = require('fs')
// 必须在路由器中间之后声明使用 ↓↓↓↓ !!!!!!!!!!!!!!!!!!!!!!!!
//用了哈希路由就不用这个 否则使用history路由 一刷新就会出现读取js,css或者其他错误
app.use((req, res) => {
fs.readFile(__dirname + '/public/index.html', (err, data)=>{
if(err){
console.log(err)
res.send('后台错误')
} else {
res.writeHead(200, {
'Content-Type': 'text/html; charset=utf-8',
});
res.end(data)
}
})
})
//原先的连接服务器代码 此处就忽略掉咯~~~
❝好啦,mongoose的基本使用就讲到这里,这些只是最基本的使用,还有就是可视化工具的话就用Robo3T看方便哦,提前祝大家元旦快啦丫~~~
❞
本文使用 mdnice 排版