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() }) })
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端口'); })
至此完成数据库的链接
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)
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: '新增用户成功' }) // 返回响应 }
查找

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 }) }
更新

/** * 根据用户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 }) }
删除

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 }) }