mongoose-nodejs 导致超出最大调用堆栈大小,在 mongoose save()

Posted

技术标签:

【中文标题】mongoose-nodejs 导致超出最大调用堆栈大小,在 mongoose save()【英文标题】:mongoose-nodejs causing maximum call stack size exceeded, in mongoose save() 【发布时间】:2021-12-30 21:40:05 【问题描述】:

我面临的问题是:

当取消注释第 1 行和取消注释(记录)第 3 行和第 4 行时 - 它卡在那里并且不打印任何内容,一段时间后它给出了超出最大调用堆栈大小但如果我只打印字符串它不会给出任何错误。 .

我尝试了所有测试用例,错误的原因是 line1,因为如果我不做 line1,它会顺利运行

实际上,我想在 Bookings 中添加新预订后,在 bookings 数组中添加 cust(Customer) 中的预订。

async book(req, res, next) 


  const _id=req.body.id 
     /* I am getting this id From Jwt token,
    (for case I am showing as this )*/

  const category = req.params.category


  try 
       const cust = await Customer.findOne(
          _id: _id ).populate("bookings")

      const booking = new Booking(
          service: category,
          customer: cust
      )

      await booking.save()//line 0

      cust.bookings.push(booking) //line 1

       await cust.save() //line2

      console.log(cust); //line 3
      console.log(booking); //line 4
      console.log("test"); //line 5



      return res.render("status", )

   catch (error) 
      console.log(error);

  

这是客户(客户架构)

const customerSchema = mongoose.Schema(
    email: 
         type: String,

     ,
  bookings: [
  
  type: Schema.Types.ObjectId,
  ref: 'Booking'
 ])

这是预订模式(Booking)

const bookingSchema = new Schema( 
   id: 
    type: String
     ,
   service: 
    type: String
    ,
    customer: 
    type: Schema.Types.ObjectId,
    ref: 'Customer'
)

所以我的目标是,无论何时添加预订(预订模型) 对于特定客户,因此对于该特定客户,相同的预订必须在客户(客户)的预订数组中为“参考”(被推送)

为了实现这一目标

我首先在(第 0 行)保存预订 然后我在 bookings 中推送相同的预订(在 cust(客户)中的数组)[第 1 行] 然后我将 cust(Customer) 保存在 [line 2] 中

超过最大调用堆栈大小

at get (D:\my_proj\node_modules\mongoose\lib\helpers\get.js:8:30)
at isBsonType (D:\my_proj\node_modules\mongoose\lib\helpers\isBsonType.js:10:10)
at clone (D:\my_proj\node_modules\mongoose\lib\helpers\clone.js:75:7)
at cloneObject (D:\my_proj\node_modules\mongoose\lib\helpers\clone.js:125:17)
at clone (D:\my_proj\node_modules\mongoose\lib\helpers\clone.js:60:16)
at cloneObject (D:\my_proj\node_modules\mongoose\lib\helpers\clone.js:125:17)
at clone (D:\my_proj\node_modules\mongoose\lib\helpers\clone.js:60:16)
at cloneObject (D:\my_proj\node_modules\mongoose\lib\helpers\clone.js:125:17)
at clone (D:\my_proj\node_modules\mongoose\lib\helpers\clone.js:60:16)
at cloneObject (D:\my_proj\node_modules\mongoose\lib\helpers\clone.js:125:17)

【问题讨论】:

代码中有多个问题,但首先:你能分享模型架构吗?并告诉我们情况如何?并分享 cust 从哪里获得价值? 我添加了 Customer , Booking 模式,还添加了我的目标(场景),并且 cust 是从 findOne 获得的。(我还添加了!)..问题是,当我取消注释 Line 1 然后打印第 3 行或第 4 行 - 它给出了那个错误....但是当我只打印字符串 ("test") 它被打印出来并且一切正常。我用 Line2 (line1 commented) 进行了试验,没有第 2 行的问题 答案对你有用吗? 它给出错误转换错误。 ObjectId 无法转换为字符串 cust.bookings.push(mongoose.Types.ObjectId(booking._id)) //line 1 【参考方案1】:

#1> 因为您在架构中将预订对象类型定义为ObjectId,但在line1 中您试图推送一个对象。

cust.bookings.push(booking) //line 1

所以试试这个吧:

cust.bookings.push(mongoose.Types.ObjectId(booking._id)) //line 1

#2>

如果之后不传递数据,则需要在此行中删除逗号。

return res.render("status", )

最好res.redirect('/route') 并渲染路线。

【讨论】:

以上是关于mongoose-nodejs 导致超出最大调用堆栈大小,在 mongoose save()的主要内容,如果未能解决你的问题,请参考以下文章

在我的文件中找不到任何导致 Uncaught RangeError: 超出最大调用堆栈的递归

跨线程共享的 django 连接导致 ora-01000 超出最大打开游标

Python virtualenv pip install MySQL-Python 导致“RuntimeError:超出最大递归深度”

Tomcat服务器优化

“RangeError:超出最大调用堆栈大小”为啥?

Angular 11最大调用堆栈大小超出错误