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

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 }) }
浙公网安备 33010602011771号