猫鼬路线,用于更新提供的字段

时间:2018-11-30 13:02:57

标签: node.js mongoose

我一直在阅读一些CRUD / Mongoose指南,但对于有条件地更新字段并没有很好的解释。

例如,在一个地方使用了一个名为updateItem的操作来更新item.price,而在另一个地方则使用了updateItem.color。有人知道Mongoose CRUD API的很好的解释或教程吗?

我的打击代码可以正常工作,但是我觉得它可能更干净:)

谢谢!

router.put('/tasks/:id', (req, res) => {
  Task.findByIdAndUpdate(req.params.id,
    req.body.owner ? { owner: req.body.owner } : { hours: req.body.hours }, { new: true })
    .then(task => {
      res.status(201).json(task)
    })
    .catch(err => {
      console.log('Our error', err)
    })
});

2 个答案:

答案 0 :(得分:1)

您可以采用的另一种方法是首先检索对象,然后仅在将值传递到放置请求中时才更新该值。例如:

router.put('/tasks/:id', (req, res) => {
  let price = req.body.price;
  let color = req.body.color;

  Task.findById(req.params.id, function (err, task) {
    if (err) return handleError(err);

    task.color = color || task.color;
    task.price = price || task.price;

    task.save(function(err, updatedTask) {
        if err return handleError(err);
        return res.send(updatedTask);
    });   
  });
});

答案 1 :(得分:1)

这是使用async-await functions的另一种更清洁的方法:

// Import promisify from utils
const promisify = require('utils').promisify;

// Wrap findByIdAndUpdate into a promise
const updateOwnerPromise = promisify(Task.findByIdAndUpdate);

// Write an async handler now
updateOwnerPromiseAsync = async (req, res) => {

    const replacementObject = req.body.owner ? { owner: req.body.owner } : { hours: req.body.hours };

    try {
        await updateOwnerPromise(replacementObject, { new:true} );
        return res.status(200).send({ message: 'Owner updated successfully!' });
    } catch(err) {

        // TODO: handle error here
        console.log('Our error', err)
        return res.status(500).send({ message: 'Failed to update owner, because of some issue at the server!' });
    }
}

// Modify the express route with the handler
router.put('/tasks/:id', updateOwnerPromiseAsync);