findOneAndUpdate 在客户端返回 null

Posted

技术标签:

【中文标题】findOneAndUpdate 在客户端返回 null【英文标题】:findOneAndUpdate returns null with client side 【发布时间】:2020-09-13 11:07:49 【问题描述】:

我是 mongodb 和 mongoose 的新手。

我有这个请求在邮递员上完美运行(更新预订号)

  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&new 属性为真时,它不应该为空, 我试过了,但没有任何改变。 我试图从客户端发送静态参数,但它仍然返回 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,

知道如何解决这个问题吗??

【问题讨论】:

您能否确认 updatedPlaces 是一个如下所示的对象: places: value 。在调用您的 updatePlaces 函数之前,可能是 console.log(updatedPlaces) 我用静态值测试,总是返回null 所以axios.put(url, places: "1" ) 不起作用?如果你在后端测试它会发生什么。 const places = places: "1" 而不是 const places = req.body.places;? 等待,返回 null。您的函数 updatePlaces 将始终返回 null。您没有在该函数中返回任何内容,而是触发了调度操作。那是问题吗?你检查过你的数据库,那里的值更新了吗? 在执行updatePlaces函数后,places属性在数据库中更改为null并且没有抛出错误......我认为我的问题来自更改参数中传递的值的请求在它到达数据库之前,或者 mongodb 改变它......我不是专家 【参考方案1】:

查看您的邮递员请求,您将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

【讨论】:

updatedPlaces 只是一个变量名。它包含请求正文。重要的是updatedPlaces = places: rightType 【参考方案2】:

这可能不是最终解决方案,但请尝试将其作为下一步来调试您的问题:

  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);
);

【讨论】:

以上是关于findOneAndUpdate 在客户端返回 null的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB findOneAndUpdate 返回 null

MongoDB findOneAndUpdate 返回 null

猫鼬 findOneAndUpdate 为 err 和 doc 返回 null(使用 Jest)

Mongoose:findOneAndUpdate 不返回更新的文档

Mongoose:findOneAndUpdate 不返回更新的文档

Mongoose:findOneAndUpdate 不返回更新的文档