Ошибка: TypeError: user.insertOne не является функцией, использующей mongoose - PullRequest
1 голос
/ 22 марта 2020

У меня проблемы с созданием маршрутов для отправки в MongoDB. Когда я возвращаю пользователя, он возвращает полную базу данных. Это касается использования пользователя или «пользователя». Пользователь модели let User = require('../models/user.model');

 User.findById(req.params.id)
    .then(user => {
        if (!user)
            res.status(404).send("data is not found");
        else
            for(var key in req.body.proposal) {
                //res.send(user.proposal)
                //res.send(user)
                //res.send(User.username)
                user.proposal.insertOne(
                    { 
                        "uid" : req.body.proposal[key].uid,
                        "clientEmail" : req.body.proposal[key].clientEmail,
                        "summary" :req.body.proposal[key].summary,
                        "terms" :req.body.proposal[key].terms,
                        "form" :req.body.proposal[key].form 
                    } //update
                )
            }
     user.save()
        .then(user => res.json(user))
        .catch(err => res.status(400).json('Error: ' + err));   
    })
    .catch(err => res.status(400).json('Error: ' + err));
});

Спасибо заранее!

1 Ответ

0 голосов
/ 22 марта 2020

Это должно быть примерно так:

let proposalArr = [];
for (const key in req.body.proposal) {
  proposalArr.push({
    uid: req.body.proposal[key].uid,
    clientEmail: req.body.proposal[key].clientEmail,
    summary: req.body.proposal[key].summary,
    terms: req.body.proposal[key].terms,
    form: req.body.proposal[key].form
  });
}
user.proposal = proposalArr;
user.save().............

Вы не можете использовать .insertOne в результате запроса к базе данных, это функция модели mon goose для вставки нового документа в коллекцию, но не вставлять новые поля в объекты. Вам нужно сделать то же самое, что добавить новые поля к объекту json, используя код. js, но mon goose будет отслеживать изменения объекта, а при использовании .save() он может обновить документ в коллекции со всеми этими изменениями. .

Вместо двух вызовов БД вы можете сделать это за один вызов. Проверьте: .findByIdAndUpdate () и попробуйте следующий пример кода:

let proposalArr = [];
for (const key in req.body.proposal) {
  proposalArr.push({
    uid: req.body.proposal[key].uid,
    clientEmail: req.body.proposal[key].clientEmail,
    summary: req.body.proposal[key].summary,
    terms: req.body.proposal[key].terms,
    form: req.body.proposal[key].form
  });
}

User.findByIdAndUpdate(
  req.params.id,
  {
    proposal: proposalArr
  },
  { new: true }
)
  .then(user => {
    if (!user) res.status(404).send("data is not found");
    res.json(user);
  })
  .catch(err => res.status(400).json("Error: " + err));
...