Mongoose+Express前端小白基本使用

812 阅读4分钟

一、基本结构

这个是我个人比较喜欢的结构
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 排版