RangeError:超出未知原因的最大调用堆栈大小

时间:2014-03-11 09:31:47

标签: javascript node.js jasmine

一点介绍:我写这个问题时确实解决了问题,现在我只是想知道,为什么它首先出现在那里:

我正在尝试使用mongoose从mongoDB中检索数据。代码在99%没有问题的情况下工作,并且由于某种原因,仅从特定表中查找具有特定功能的数据导致“超出最大调用堆栈大小” - 错误。

现在我有茉莉花测试应该确认datalayerdatas-table工作正常,但是当它通过getData.js检索数据时,它会抛出错误。

堆栈顺序的代码。

gameData-spec.js(jasmine spec):

   getData.getDataLayer(dataToFind)
    .then(function(data) {
        console.log("DATA getDataLayer", data[0]);
    })
    .catch(function(e) {
        console.log("Error in finding dataLayerData", e.stack);
    });

getData.js(获取数据的代理/ API功能):

ret.getDataLayer = function getData(data) {
   console.log(666)
   return getData(dataLayerData.getDataByPlayer, {gameID: data.gameID, playerID: data.playerID, turnID: data.turnID});
};

function getData (DBfunc, data) {
    var promise = DBfunc(data);

    return promise;
}

gameData.js(从mongoDB中检索数据):

dataLayerData :( function dataLayerData(){       var ret = {};

  ret.insert = function (data) {
      return insertData( models.dataLayerData, data);
  };

  ret.getDataByPlayer = function (data) {
      var ObjectId = require('mongoose').Types.ObjectId;
      return getData( models.dataLayerData, { gameID: ObjectId(String(data.gameID)), playerID: data.playerID, turnID: data.turnID } );
  };
  return ret;
})()

对于其他表我甚至不需要mong.Schema.Types.ObjectId规范,当找到数据时,但我尝试了这个,虽然没有任何效果(基本上我需要它手动从命令行执行mongoDB所以我想我也需要它。)

mongoDB Schema:

var dataLayerData = new mong.Schema({
     "playerID": Number,
     "gameID": mong.Schema.Types.ObjectId,
     "turnID": Number,
     "objects": [
        {
           "dataName": String,
           "dataType": String,
           "objects": {
           }
        }
     ]
});

现在如上所述,还有其他表格以完全相同的方式检索并且它们有效。即使我将gameData-spec.js.call替换为其他一些数据库查找,它也可以正常工作。我不明白为什么它甚至会进入回调循环以及如何。

为了调试和清除问题,我将console.log(666)设置为getData.js,并且它一直在向控制台发送垃圾邮件。所以出于某种原因,似乎一遍又一遍地调用函数。

后来我注意到getData调用是不必要的(这是一个精简版本)。为什么只是之间的调用会导致最大的调用堆栈错误?

1 个答案:

答案 0 :(得分:2)

问题是getData内的getDataLayer不是下面定义的getData函数,实际上是上面的getData函数被调用者,用于递归。递归可能导致JavaScript溢出。

               // fixed ---v---
ret.getDataLayer = function(data) {
   console.log(666)
   return getData(dataLayerData.getDataByPlayer, {gameID: data.gameID, playerID: data.playerID, turnID: data.turnID});
};