findOneAndUpdate возвращает null со стороны клиента - PullRequest
0 голосов
/ 26 мая 2020

Я новичок в mongodb и mon goose.

У меня есть этот запрос, который отлично работает с почтальоном (обновить номер бронирования)

  router.put("/book/:idEvent", (req, res) => {

  const _idEvent = req.params.idEvent;
  const places = req.body.places;

  Event.findOneAndUpdate(
    { _id: _idEvent },
    {
      $set: { places },
    },
    {new:true, upsert:true},
  )
    .then((event) => res.json(event))
    .catch((err) => res.json(err));
});

Но когда я вызываю это на стороне клиента он вставляет null в места атрибутов. Согласно документации mongodb, он не должен быть нулевым, когда upsert и новые свойства верны, я пробовал, но ничего не изменилось. Я попытался отправить аргументы stati c со стороны клиента, но он все равно возвращает null. мой метод внешнего интерфейса:

   export const updatePlaces = (idEvent, updatedPlaces) =>  (dispatch) => {
   axios
    .put(`http://localhost:5000/events/book/${idEvent}`, updatedPlaces)
    .then((res) => dispatch(getEvents()))
    .catch((err) => console.log(err));
};

Я также узнал, что templateId отправляется через запрос Xhr со стороны клиента, а отправка информации с помощью Xhr (или любого запроса типа Ajax) преобразует все в строку ': поэтому я изменил тип атрибута в схеме с Number на String, но снова он возвращает null.

places: { type: String},

Есть идеи, как решить эту проблему ??

Ответы [ 2 ]

0 голосов
/ 26 мая 2020

Это, вероятно, не окончательное решение, но попробуйте это в качестве следующего шага для отладки вашей проблемы:

  router.put("/book/:idEvent", async (req, res) => {

  const _idEvent = req.params.idEvent;
  const places = req.body.places;

  const event = await Event.findOneById(_idEvent):

  if(!event) {
     console.log("event not found", _idEvent);
     // do your upsert logic here
     return;
  }

  // this code is for debugging
  if(!places) {
     throw Error("You never passed a places value in the first place!")
  }

  const placesVal = Number.parseInt(places, 10);
  if(Number.isNaN(placesVal)) {
      throw Error("Not a valid number", placesVal)
  }
  event.places = placesVal;
  const result = await event.save();
  res.json(result);
});
0 голосов
/ 26 мая 2020

Глядя на ваш запрос почтальона, вы назначаете const places req.body.places:

 router.put("/book/:idEvent", (req, res) => {

  const _idEvent = req.params.idEvent;
  const places = req.body.places;

, но в коде на стороне клиента вы передаете updatedPlaces своему запросу:

export const updatePlaces = (idEvent, updatedPlaces) =>  (dispatch) => {
   axios
    .put(`http://localhost:5000/events/book/${idEvent}`, updatedPlaces)
    .then((res) => dispatch(getEvents()))
    .catch((err) => console.log(err));
};

пробовали ли вы присвоить const places req.body.updatedPlaces?

...