【问题标题】:mongoose-nodejs causing maximum call stack size exceeded, in mongoose save()mongoose-nodejs 导致超出最大调用堆栈大小,在 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

标签: node.js express mongoose mongoose-schema mongoose-populate


【解决方案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') 并渲染路线。

【讨论】:

    猜你喜欢
    • 2013-08-18
    • 2012-05-27
    • 2020-04-14
    • 2014-08-19
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    相关资源
    最近更新 更多