首页 > 解决方案 > 在将字段保存到数据库之前,我应该如何更改字段的值?

问题描述

我是 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 的值。有人可以让我知道代码有什么问题吗?谢谢!

标签: node.jsmongodbmongoose

解决方案


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')在这种情况下,该功能是不必要的。


推荐阅读