node.js - 在将字段保存到数据库之前,我应该如何更改字段的值?
问题描述
我是 Node.js 的新手,我现在正在尝试执行 CRUD 操作。我有这个功能可以将数据保存到 mongoDB 数据库,但问题是我试图在将一个特定字段的值保存到数据库之前更改它的值。问题是我的数据首先被保存,然后正在执行计算。这是我的帖子功能:
router.post('/', async(req, res) => {
const reservation = new Reservation({
guestID: mongoose.Types.ObjectId(req.body.guestID),
roomID: mongoose.Types.ObjectId(req.body.roomID),
checkIn: req.body.checkIn,
checkOut: req.body.checkOut,
numberOfAdults: req.body.numberOfAdults,
totalCost: req.body.totalCost,
numberOfChildren: req.body.numberOfChildren
})
try
{
const reservationRecord = await reservation.save()
res.json(reservationRecord)
}
catch(err)
{
console.log(err)
res.send("Error")
}
})
这是架构
const mongoose = require('mongoose')
const axios = require('axios')
const reservationSchema = new mongoose.Schema({
guestID: {
type: mongoose.SchemaTypes.ObjectId,
required: true
},
roomID: {
type: mongoose.SchemaTypes.ObjectId,
required: true
},
checkIn: {
type: Date,
required: true
},
checkOut: {
type: Date,
required: true
},
numberOfAdults: {
type: Number,
required: true
},
numberOfChildren: {
type: Number,
required: true
},
totalCost: {
type: Number,
required: false,
default: 0
}
})
reservationSchema.pre('save', function(next){
var date1 = new Date(this.checkIn);
var date2 = new Date(this.checkOut);
var diff = Math.abs(date1.getTime() - date2.getTime());
var diffDays = Math.ceil(diff / (1000 * 3600 * 24));
console.log(diffDays)
var roomCost
var totalRoomCost
axios.get("http://localhost:5555/rooms/" + this.roomID).then((response) => {
console.log(response)
roomCost = response.data.cost;
console.log("room cost is " + roomCost)
totalRoomCost = (this.numberOfAdults + this.numberOfChildren) * response.data.cost * diffDays
this.totalCost = totalRoomCost
})
//this.totalCost = (this.numberOfAdults + this.numberOfChildren) * roomCost * diffDays
console.log(this.totalCost)
next()
})
const Reservation = mongoose.model('reservation', reservationSchema)
module.exports = Reservation
我想在将其保存到数据库之前更改 totalCost 的值。有人可以让我知道代码有什么问题吗?谢谢!
解决方案
Reservation
在创建新实例之前,您应该只处理 POST 方法中的计算:
router.post('/', async (req, res) => {
try {
const {
numberOfChildren,
numberOfAdults,
roomID,
checkIn,
checkOut,
} = req.body;
var date1 = new Date(checkIn);
var date2 = new Date(checkOut);
var diff = Math.abs(date1.getTime() - date2.getTime());
var diffDays = Math.ceil(diff / (1000 * 3600 * 24));
const room = await Room.findById(roomID)
const newTotalCost = (numberOfAdults + numberOfChildren) * room.cost * diffDays;
const reservation = new Reservation({
...req.body,
totalCost: newTotalCost,
});
const reservationRecord = await reservation.save();
res.json(reservationRecord);
} catch (err) {
console.log(err);
res.send('Error');
}
});
当然,reservationSchema.pre('save')
在这种情况下,该功能是不必要的。
推荐阅读
- java - Thymeleaf 片段处理器和 Spring 5
- java - 需要了解 logstash 和 elk
- azure - 如何获取 terraform 计划以在集群内创建私有 AKS 集群和命名空间?
- terraform - Terraform Remote StateFile 用于相同配置的多个实例
- dropdown - Bootstrap 的导航栏下拉链接不起作用
- python - 将 pandas 列中的每个项目与另一个 df 相乘以生成新列
- apache-spark - 未为 spark-submit 加载 SQL 扩展
- azure - Cosmos DB 更改源源的 Azure 函数不会运行:找不到作业函数
- google-cloud-platform - BIGQUERY:连接谓词中的表不受支持的子查询
- android - 我没有在项目级别检索 build.gradle 文件