一点介绍:在撰写本文时,我实际上已经解决了问题,现在我只想知道,为什么它首先存在:
我正在尝试使用 mongoose 从 mongoDB 检索数据。该代码可以正常工作 99%,并且由于某种原因,仅从具有特定函数的特定表中查找数据会导致“超出最大调用堆栈大小”错误。
现在我有 Jasmine 测试,应该确认 datalayerdatas-table 工作正常,但是当它通过 getData.js 检索数据时,它会抛出错误。
代码按堆栈顺序排列。
gameData-spec.js( Jasmine 规范):
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:(函数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 架构:
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 调用是不必要的(这是一个精简版本)。为什么中间的调用会导致最大调用堆栈错误?
最佳答案
问题在于,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});
};
关于javascript - 范围错误: Maximum call stack size exceeded from unknown reason,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22321552/