当前位置: 首页 > 面试题库 >

猫鼬-RangeError:超出最大调用堆栈大小

和丰羽
2023-03-14
问题内容

我试图将文档批量插入MongoDB中(因此绕过Mongoose并使用本机驱动程序,因为Mongoose不支持批量插入文档数组)。我这样做的原因是为了提高写作速度。

我在以下代码中的console.log(err)处收到错误“ RangeError:超出最大调用堆栈大小”:

function _fillResponses(globalSurvey, optionsToSelectRegular, optionsToSelectPiped, responseIds, callback) {
  Response.find({'_id': {$in: responseIds}}).exec(function(err, responses) {
    if (err) { return callback(err); }

    if (globalSurvey.questions.length) {
      responses.forEach(function(response) {
        console.log("Filling response: " + response._id);
        response.answers = [];
        globalAnswers = {};
        globalSurvey.questions.forEach(function(question) {
          ans = _getAnswer(question, optionsToSelectRegular, optionsToSelectPiped, response);
          globalAnswers[question._id] = ans;
          response.answers.push(ans);
        });
      });
      Response.collection.insert(responses, function(err, responsesResult) {
        console.log(err);
        callback()
      });
    } else {
        callback();
      }
  });
}

也许与Mongoose返回的响应数组的格式有关,这意味着我不能直接使用MongoDB进行本机插入吗?我已经在每个响应上尝试了.toJSON(),但是没有运气。

即使只有少量数据,我仍然会收到错误,但是循环遍历并分别调用每个文档上的Mongoose保存效果很好。

编辑:我认为它与此问题有关:http :
//howtosjava.blogspot.com.au/2012/05/nodejs-mongoose-rangeerror-maximum-
call.html

我的响应方案是:

var ResponseSchema = new Schema({
  user: {
    type: Schema.ObjectId,
    ref: 'User'
  },
  randomUUID: String,
  status: String,
  submitted: Date,
  initialEmailId: String,
  survey: String,
  answers: [AnswerSchema]
});

因此,答案是响应中的子文档。不知道如何解决它…。


问题答案:

我遇到了同样的问题,我开始研究猫鼬的源代码(版本3.8.14)。最终它引导我进入了这条线

  • mongoose / node_modules / mongodb / lib / mongodb / collection / core.js-> 插入 (…)-> insertWithWriteCommands (…)->
  • mongoose / node_modules / mongodb / lib / mongodb / collection / batch / ordered.js-> bulk.insert(docs [i]) -> addToOperationsList(…) -> bson.calculateObjectSize(document,false);

var bsonSize = bson.calculateObjectSize(document,false);

显然,这调用了BSON.calculateObjectSize,后者调用了calculateObjectSize,然后无限递归。我无法深入探究导致它的原因,但发现它可能与将猫鼬包装器绑定到Schema的功能有关。由于我将原始数据插入到mongoDB中,因此,一旦我决定将mongoose中的批量插入更改为标准javascript对象,问题就消失了,批量插入正确地发生了。您可能可以执行类似的操作。

本质上,我的代码来自

//EDIT: mongoose.model needs lowercase 'm' for getter method

var myModel = mongoose.model('MyCollection');
var toInsert = myModel();
var array = [toInsert];
myModel.collection.insert(array, {}, function(err, docs) {});

//EDIT: mongoose.model needs lowercase 'm' for getter method

var myModel = mongoose.model('MyCollection');
var toInsert = { //stuff in here 
   name: 'john',
   date: new Date()
};
var array = [toInsert];
myModel.collection.insert(array, {}, function(err, docs) {});


 类似资料:
  • 问题内容: 我想这意味着有一个循环引用,但是对于我的一生,我无法猜测如何解决它。 有人有主意吗? http://plnkr.co/edit/aNcBcU?p=预览 检查Chrome中的调试控制台(例如),您将看到错误。冒犯的行是 通过以下方式在控制器上对scope.map进行“ $ watched” 问题答案: 这是因为您要比较对象是否相等,而不是参考。将您的声明更改为此:

  • 这是我在React中的第一个应用程序。在localhost中,一切正常,当我使用Github Pages部署时,我的应用程序(Info/Images/evenements)中的一些页面无法呈现。每次单击他们的链接访问他们时,我都会在控制台上看到一个白色页面和此错误: range error:object . tostring处超出了最大调用堆栈大小 同样,当我刷新页面时,github pages返

  • 我将redux添加到我的项目中进行状态管理,在添加reducer之前一切都很好 我认为每个中间件功能的下一步(操作)都会导致问题,但我不知道如何修复它。 我使用的是React 17.0.2,React redux 7.2.3,redux 4.1.2。 动作-- 中间件-- 中间件-- 减速机 -- 商店.js:

  • 当我为图表(react-chartjs-2)获取数据时,我收到了这个错误。我实现了try/catch块,但不知道如何删除这个错误。在Edge浏览器上,我得到了CRIPT28:SCRIPT28:堆栈空间不足 这是我在组件中调用的操作。 这是连接到redux存储的组件。它在我看来一切都很好。

  • React.js用props给后代组件发值错了? 我编写了前面的演示来测试使用向后代组件发送信息。但它导致了错误: 未捕获的范围错误:对象超过了最大调用堆栈大小。克隆元素 但是我在演示运行良好后才写,所以你能告诉我是什么原因导致错误吗?

  • 如果我逃跑 在铬33上,我得到 为什么?