2017-07-03 183 views
0

我有一個PUT路由來更新值。我從兩個地方打這條路線。一個是發送有關詳細信息和一個約完成的信息。問題是貓鼬正在更新攤位,即使它只從一箇中獲得價值。貓鼬只更新已更改的值

因此,如果我發送有關完成的信息,它是真的,後者我用新的細節(沒有完成的價值)擊中這條路線,它會更新完成也是錯誤的。我如何只更新已更改的值?

router.put('/:id', (req, res) => { 
    Todo.findOne({_id:req.body.id}, (err, foundObject) => { 
     foundObject.details = req.body.details 
     foundObject.completed = req.body.completed 
    foundObject.save((e, updatedTodo) => { 
     if(err) { 
     res.status(400).send(e) 
     } else { 
     res.send(updatedTodo) 
     } 
    }) 
    }) 
}) 

編輯: 感謝傑克遜暗示我設法做這樣。

router.put('/:id', (req, res) => { 
    Todo.findOne({_id:req.body.id}, (err, foundObject) => { 
    if(req.body.details !== undefined) { 
     foundObject.details = req.body.details 
    } 
    if(req.body.completed !== undefined) { 
     foundObject.completed = req.body.completed 
    } 
    foundObject.save((e, updatedTodo) => { 
     if(err) { 
     res.status(400).send(e) 
     } else { 
     res.send(updatedTodo) 
     } 
    }) 
    }) 
}) 
+0

如果要更新的文件,[更新](http://mongoosejs.com/docs/api.html#model_Model.update)它,不要保存它。 –

回答

1
const updateQuery = {}; 

if (req.body.details) { 
    updateQuery.details = req.body.details 
} 

if (req.body.completed) { 
    updateQuery.completed = req.body.completed 
} 

//or 
Todo.findOneAndUpdate({id: req.body.id}, updateQuery, {new: true}, (err, res) => { 
    if (err) { 

    } else { 

    } 
}) 

//or 
Todo.findOneAndUpdate({id: req.body.id}, {$set: updateQuery}, {new: true}, (err, res) => { 
    if (err) { 

    } else { 

    } 
}) 
+0

謝謝傑克遜。我設法做到了。檢查完成時是否(req.body.completed)不起作用是錯誤的,我需要將其更改爲true。相反,我用if(req.body.completed!== undefined) –

+0

是的,我錯過了null,false,0 :) – Jackson