【问题标题】:RangeError: Maximum call stack size exceeded from unknown reasonRangeError:由于未知原因超出了最大调用堆栈大小
【发布时间】:2023-03-05 06:48:01
【问题描述】:

一个小介绍:在写这篇文章时,我实际上已经解决了这个问题,现在我只想知道,为什么它首先会出现:

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

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

堆栈顺序的代码。

gameData-spec.js(茉莉花规格):

   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 调用是不必要的(这是一个精简的版本)。为什么只是中间的调用会导致最大调用堆栈错误?

【问题讨论】:

  • 看来getData里面的getDataLayer不是下面定义的getData,实际上是上面的getData函数被调用者,用于递归。这是故意的吗?递归会导致 JS 溢出。
  • 不,不是故意的,自然是这个原因。谢谢你帮我解决这个问题!这也被视为正确答案。不幸的是,当我长时间调试自己的代码时,我变得非常有眼光。我通常不喜欢出于调试目的使用匿名函数,但我想我现在开始不这么想了:D。

标签: javascript node.js jasmine


【解决方案1】:

问题是getDataLayer里面的getData不是下面定义的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});
};

【讨论】:

    猜你喜欢
    • 2020-11-19
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 2017-01-14
    • 2018-01-24
    • 2018-02-06
    相关资源
    最近更新 更多