zoukankan      html  css  js  c++  java
  • mongoose

    1.数据库链接模块 db/index.js

    定义好只好往app.js里面引入

    const mongoose = require('mongoose')
    const { DB_URL } = require('../params')
    module.exports = _ => new Promise((resolve, reject) => {
      mongoose.connect(DB_URL, { useNewUrlParser: true, useUnifiedTopology: true, useFindAndModify: false, useCreateIndex: true })
      mongoose.connection.on('open', err => {
        if (err) return reject(err)
        console.log('数据库链接成功')
        resolve()
      })
    })
    View Code

     app.js引入

    启动顺序是app.js node服务器启动,然后数据库链接成功启动。然后是其他行为

    const express = require('express')
    const path = require('path')
    const app = express()
    const connectDB = require('./db/index')
    
    ~(async () => {
    
      await connectDB()
      app.engine('html', require('express-art-template'));
      app.set('views', path.join(__dirname, 'views'));
    
      app.use(express.static('./public/'))
    
      // 批量导入分路由
      require('./route')(app)
    })()
    
    app.listen(3000, () => {
      console.log('服务正常启动在3000端口');
    })
    View Code

    至此完成数据库的链接

    mongoose的数据库模型定义参考

    const { model, Schema } = require('mongoose')
    const userSchema = new Schema(
      {
        userId: {
          type: String,
          required: true,
          unique: true, //学号唯一
        },
        name: {
          type: String,
          required: true,
        },
        password: {
          type: String,
          required: true,
          select: false //select设置成false 表示从查询结果中不返回该字段值。如果要显示该字段值 T.opt().select('-password')
        },
        age: {
          type: Number,
          required: true,
          min: 0,
          age: 120
    
        },
        gender: {
          type: Number,
          required: true,
          enum: [0, 1], //0 男 1女 默认是男
          default: 0
        },
        hobby: {
          type: [String] //定义字符串类型数组['a','b','c'], 也就是数组类型
    
        },
        desc: {
          type: Schema.Types.Mixed //混合类型数据,任何类型数据都允许
        },
    
        createTime: {
          type: Date,
          default: Date.now
        },
        // 逻辑删除 硬盘还保存
        isActive: {
          type: Boolean,
          default: true
        }
      }, {
      versionKey: false
    })
    module.exports = model('User', userSchema) //model(表(集合)名字首字母大写,schema)
    View Code

    mongoose模型的增删改查方法

     增加

      /**
       * 用户注册
       * @param {*} request 
       * @param {*} response 
       */
      async addUser(request, response) {
        const body = request.body //并且已经是js对象类型
        // console.log("UserControl -> addUser -> body", body)
        // 数据校验(主要是数据格式和是否存在重复用户)
        const errors = validationResult(request);
        if (!errors.isEmpty()) {
          return response.status(422).json({ errors: errors.mapped({ onlyFirstError: false }) }); //onlyFirstError 默认值false 返回所有错误
        }
        // 密码加密
        body.password = await bcrypt.hash(body.password, 10)
        // 写入数据库
        const newUser = await UserModel.create(body) //body 是一个对象
        response.json({
          code: 200,
          message: '新增用户成功'
        })
    
        // 返回响应
      }
    View Code

    查找

    async getUserList(request, response) {
        const userList = await UserModel.find() //表示查所有数据,返回数组集合
        const userList1 = await UserModel.find({ userId: '100111' }) //就算是一条数据也包裹在数组里[{}],如果条件查询不到返回[]空数组
        const userList2 = await UserModel.findOne({ gender: 0 }) //条件匹配多个,也只是返回第一个(对象形式返回).如果不匹配条件,返回null
        console.log(userList2);
    
        response.json({
          code: 200,
          message: '获取用户列表数据成功',
          data: userList2
        })
    
      }
      async getUserById(request, response) {
        let userId = request.params.id
        const user = await UserModel.findById(userId) //找到是单个数据对象{},找不到是null
        const user1 = await UserModel.findOne({ _id: userId }) //findById(userId) 和findOne({_id:userId}几乎完全等价
        const user1 = await UserModel.findOne({ _id: userId }).select('-hobby -_id') //select()选择要返回的数据内容,中间有空格
        response.json({
          code: 200,
          message: 'success',
          data: user1
        })
      }
    View Code

    更新

      /**
       * 根据用户ID更新数据信息
       * @param {*} request 
       * @param {*} response 
       */
      async updateUserById(request, response) {
    
        let userId = request.params.userId
        const res = await UserModel.updateOne({ _id: userId }, { name: 'zs' }) // res={"n": 1,"nModified": 1,"ok": 1} 修改一条
        const res1 = await UserModel.updateMany({ age: { $gt: 10 } }, { name: 'zs1' }) // res1={"n": 4,"nModified": 4,"ok": 1} 满足条件的全部修改
        const res2 = await UserModel.findByIdAndUpdate(userId, { name: 'zss' })//res2 是:如果找到了对应id,返回user对象{},查找不到id返回null
        // console.log(res2);
        response.json({
          code: 200,
          message: 'success',
          data: res2
    
        })
      }
    View Code

    删除

      async deleteUserById(request, response) {
        let userId = request.params.userId
        const res=await UserModel.deleteOne({_id:userId}) //res={"n": 1,"deletedCount": 1,"ok": 1} 删除一条
        const user=await UserModel.findByIdAndRemove(userId) //根据id删除,如果用户存在删除成功返回被删除的对象,根据id查找不到用户id,返回null
        console.log(user);
        UserModel.findOneAndUpdate
        response.json({
          code: 200,
          message: `删除userId是${userId}用户数据成功`,
          data:user
        })
      }
    View Code
  • 相关阅读:
    perl学习笔记三
    linux下编译C/C++
    redis学习笔记——数据类型
    redis学习笔记二
    perl学习笔记二
    hadoop实战 -- 网站日志KPI指标分析
    Java反射与动态代理
    使用maven来管理您的java项目
    使用MapReduce实现一些经典的案例
    编译本地64位版本的hadoop-2.6.0
  • 原文地址:https://www.cnblogs.com/xiaoliziaaa/p/13337649.html
Copyright © 2011-2022 走看看