Как мне обновить вложенные документы mon goose через форму отправки запроса - PullRequest
0 голосов
/ 08 января 2020

У меня есть система схем с вложенными схемами для создания отношения один ко многим.

Схема пользователя

const expenseSchema = new Schema({
  expense: String,
  value: Number
});

const budgetSchema = new Schema({
  earnings: Number,
  expenses: [expenseSchema]
});

const userSchema = new Schema({
  username: String,
  name: String,
  googleId: String,
  budget: [budgetSchema]
});

Я пытаюсь набрать sh значение для этих вложенных схем, но возникли некоторые проблемы. Примечание Значение req.user для аутентифицированных пользователей с помощью паспортной аутентификации

Это моя попытка добавить данные в свойство заработка бюджетной схемы . Странно то, что когда я регистрирую пользователя после запроса на публикацию, он показывает undefined.

router.post("/", (req, res) => {
  User.findOneAndUpdate(req.user, {
    $push: {
      budget: {
        earnings: req.body.earning
      }
    }
  });
  console.log(req.user);
});

Vue form

submitBudget() {
  const expenses = this.mergeKeyAndValue();

  axios
    .post("http://localhost:3000/budget", {
      earning: this.earnings,
      expenses
    })
    .then(response => {
      console.log(response.data);
    })
    .catch(e => {
      console.error(e);
    });
}

1 Ответ

0 голосов
/ 08 января 2020
router.post("/", (req, res) => {
 User.findOneAndUpdate(req.user,
 {$push:{
   budget: {
     earnings: req.body.earning
   }
 }

 }
 )
  console.log(req.user);
})

Здесь вы не предоставляете функцию обратного вызова для User.findOneAndUpdate (), и без такой функции все, что вы делаете - это запрашиваете базу данных без сохранения чего-либо.

Взято из пн goose документы о Model.findOneAndUpdate ()

A.findOneAndUpdate(conditions, update, options, callback) // executes
A.findOneAndUpdate(conditions, update, options)  // returns Query
A.findOneAndUpdate(conditions, update, callback) // executes
A.findOneAndUpdate(conditions, update)           // returns Query -> This is what you are doing right now.
A.findOneAndUpdate()                             // returns Query

Кроме того, ваш синтаксис неправильный, поэтому, вероятно, вы получаете неопределенное значение. Это должно быть Users.findOneAndUpdate({ username: req.user },..... или где хранится ваш req.user ключ имени пользователя, который содержит объект запроса.

Вы можете переписать всю функцию, используя async / await, следующим образом:

router.post("/", async (req, res) => {
    const update = await User.findOneAndUpdate(
        { username: req.user.username },
        {
            $push: {
                budget: {
                    earnings: req.body.earning
                }
            }
        }
    )
    console.log(update);
});

У меня нет простого способа протестировать обновление $push, поэтому я предполагаю, что вы знаете, что делаете, но все остальное должно быть так, как описано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...