Skip to content

moogoose的简单使用与增删改查

初始化model

  • 在根目录创建models文件夹,用于存放mongodb的模型一个个文件 以users举例:

1、先创建一个model出来并导出

js
const mongoose = require('mongoose') // 引入mongoose
const Schema = mongoose.Schema // 引入schema(计划),可以理解计划一个模型(model)

const UserSchema = new Schema ({
    name: {
        type: String,
        required: true
    },
    email: {
        type: String,
        required: true
    },
    password: {
        type: String,
        required: true
    },
    avatar: {
        type: String,
        required: false,
        default: '//1.gravatar.com/avatar/767fc9c115a1b989744c755db47feb60?s=200&r=pg&d=mp'
    },
    date: {
        type: String,
        required: false,
        default: Date.now() // default可以是一个函数,但是要return出来
    },
})
// model接受两个参数,表名和schema
module.exports = User = mongoose.model('users', UserSchema)

2、引入model模块,新增一个用户,并加密密码存储到数据库中

js
// login and register
const express = require('express')
const router = express.Router()
const User = require('../../models/User.js') // 引入上面定义的模型
// 引入加密
const bcrypt = require('bcrypt')

router.post('/register', (req, res) => {
    User.findOne({email: req.body.email})
        .then((result) => {
            if (result) {
                return res.status(200).json({code: 1, msg: '该邮箱已被注册!'})
            }else{
                // new User执行完成后存储在mongoose的虚拟内存中,并没存入到数据库中,需要调用newUser实例的save()方法!!!
                const newUser = new User({
                    name: req.body.name,
                    email: req.body.email,
                    password: req.body.password
                })
                bcrypt.genSalt(10, (err, salt) => { // params(10加密级别,回调)
                    bcrypt.hash(newUser.password, salt, (err, hash) => {// params:(需要加密的数字,salt固定回调,回调)
                        if (err) {
                            throw err
                        }else{
                            newUser.password = hash // hash为加密后的密码
                            // 调用mongoose提供的保存方法,返回的是promise对象
                            newUser.save()
                                    .then((userInfo) => {
                                        console.log(`注册成功:${userInfo}`)
                                        res.json(userInfo)
                                    })
                                    .catch((error) => {
                                        console.log(`注册失败:${error}`)
                                        res.json(error)
                                    })
                        }
                    })
                })

            }
        })
        .catch((error) => {
            console.log(`数据库未连接或出错:${error}`)
        })
})
module.exports = router // 导出模块,在app.js中可以使用express中间件调用

3、删除用户

js
// 删
router.post('/deleteUser', (req, res) => {
    let email = req.body.email
    User.deleteOne({
        email
    }).then((data) => {
        console.log(data)
        if(data.deletedCount === 1) return res.json({code: 0, msg: '删除成功'})
        if(data.n === 0) return res.json({code: -1, msg: '用户不存在'})
        res.json({code: -1, msg: '删除失败'})
    })
})

4、修改用户

js
// 改
router.post('/updateUser', (req, res) => {
    let newName = req.body.name
    let email = req.body.email
    User.update({
        email
    },{
        name: newName
    }).then((data) => {
        console.log(data)
        if (data.nModified === 1) return res.json({code: 0, msg: '修改成功'}) // 修改成功
        if (data.n === 0) return res.json({code: -1, msg: '用户不存在'}) // 查询条数为0
        res.json({code: -1, msg: '错误,请检查后台代码'})
    })
})

5、查找用户

js
// 查
router.post('/getUserList', (req, res) => {
    let serachText = req.body.serachText
    let reg = new RegExp(serachText) // 设置正则,支持模式查询
    console.log(reg)
    User.find({name: reg}, {password: 0}) // 第一个参数为查询条件,第二个为data限制显示字段,为0不返回,为1则返回
        .then((data) => {
            console.log(data)
            res.send({code: 0, total: data.length, list: data})
        })
})