数据已突变但未在数据库中更新

时间:2019-08-18 19:34:21

标签: node.js mongodb express mongoose

我有一个连接到mongodb数据库的服务器。当我添加一级数据然后保存时,它可以工作。

例如:

// this works fine

router.post('/user/addsomedata', async (req,res)=>{
    try {
        const user = await User.findOne({email : req.body.email})
        user.username = req.body.username
        await user.save()
        res.send()
    } catch(e) {
        res.status(404).send(e)
    }
})

但是,如果我尝试使用更深层次的数据保存对象,则不会保存该对象。我猜没有检测到更新,因此没有替换用户。

示例:

router.post('/user/addtask', auth ,async (req,res)=>{
    const task = new Task({
        name : req.body.name,
        timing : new Date(),
        state : false,
    })
    try {
        const day = await req.user.days.find((day)=> day.day == req.body.day)
        // day is found with no problem
        req.user.days[req.user.days.indexOf(day)].tasks.push(task)
        // console.log(req.user) returns exactly the expected results
        await req.user.save(function(error,res){
            console.log(res)
            // console.log(res) returns exactly the expected results with the data filled
            // and the tasks array is populated 
            // but on the database there is nothing
        })
        res.status(201).send(req.user)
    } catch(e) {
        res.status(400).send(e)
    }
})

因此,即使在保存回调之后,我仍然在控制台上填充了task数组,但在this上却什么也没有

2 个答案:

答案 0 :(得分:0)

您正在根据请求来处理用户,同时应该像第一个示例(User.findOne)一样首先从数据库中找到用户,然后更新并保存该模型。

答案 1 :(得分:0)

每当要更新猫鼬返回的结果时,在查找查询中使用 .lean()。猫鼬默认情况下返回不可变的实例对象。带有find的 lean()方法返回可以修改/更新的普通js对象。

例如使用lean()

import time import RPi.GPIO as GPIO GPIO.setmode(GPIO.BOARD) GPIO.setwarnings(False) GPIO.setup(38, GPIO.IN) while True: if GPIO.input(38) == 1: print('aan')

您可以了解有关精益here

的更多信息

希望这会有所帮助:)