как перебирать request.body и соответственно обновлять объект - PullRequest
0 голосов
/ 03 августа 2020

Просматривая этот учебник MERN , с этим маршрутом «обновления».

todoRoutes.route('/update/:id').post(function(req, res) {
    Todo.findById(req.params.id, function(err, todo) {
        if (!todo)
            res.status(404).send("data is not found");
        else
            todo.todo_description = req.body.todo_description;
            todo.todo_responsible = req.body.todo_responsible;
            todo.todo_priority = req.body.todo_priority;
            todo.todo_completed = req.body.todo_completed;            todo.save().then(todo => {
                res.json('Todo updated!');
            })
            .catch(err => {
                res.status(400).send("Update not possible");
            });
    });
});

Это схема, используемая БД:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;let Todo = new Schema({
    todo_description: {
        type: String
    },
    todo_responsible: {
        type: String
    },
    todo_priority: {
        type: String
    },
    todo_completed: {
        type: Boolean
    }
});module.exports = mongoose.model('Todo', Todo);

I хотите выполнить обновление в al oop, поэтому изменение схемы не заставит меня изменить что-то и в маршруте.

  • Как я могу сделать что-то вроде (используя Python псевдокод):

      for param in req.body:
          setattr(todo, param.name, param.value)
          # where param example might be an object with these 2 fields ('name', 'value')
    

    Вот что у меня пока:

      todoRoutes.route('/update/:id').post(function(req, res) {
          Todo.findById(req.params.id, function(err, todo) {
              if (!todo)
                  res.status(404).send("Data is not found");
              else
                  req.body.forEach(function (item) {
                      todo.setAttribute(req.body.getAttribute(item));
                  });
    
                  todo.save().then(todo => {
                      res.json('Item updated!');
                  }).catch(err => {
                      res.status(400).send("Update not possible: " + err);
                  });
          });
      });
    

Ответы [ 2 ]

1 голос
/ 03 августа 2020

Вы можете сохранить объект в одной переменной, а затем сохранить его, будут сохранены только внесенные изменения.

/**
 * Update todo function
 */
// require todo model
const Todo = require("../models/todo");

async function updateTodo(req, res) {
    const { id } = req.params; // You get the order id by parameter
    const todoData = req.body; // with this way you could save in a single variable

    try {
        const todoUpdated = await Todo.findByIdAndUpdate(id, todoData);
        if (!todoUpdated) {
            return res.status(404).send('Todo dont found');
        }

        return res.status(200).send('Todo updated successfully');
    } catch (err) {
        return res.status(500).send(err);
    }
}

module.exports = {
    updateTodo
};

0 голосов
/ 03 августа 2020

На основании ответа @ D4ITON я протестировал этот фрагмент, и он работает:

todoRoutes.route('/update/:id').post(function(req, res) {
    Todo.findByIdAndUpdate(req.params.id, req.body, function(err, todo) {
        todo.save().then(todo => {
            res.json('Item updated!');
        }).catch(err => {
            res.status(400).send("Update not possible: " + err);
        });
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...