在我的Meteor应用中进行mongodb查找时出现了奇怪的错误。控制台显示的错误为:
(node:20388) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2):
RangeError: Maximum call stack size exceeded
我搜索过一些类似的例子,但我的情况不同,与数据大小无关 -- 这是一个非常简单的查询,无论查询内容如何都会发生。
在客户端,我这样做:
Meteor.call( 'Things.search', searchString,(error,result) => {
if(error){
console.log(error);
} else {
console.log("Got result");
...
当它从服务器端返回并没有错误时,它会立即返回,结果是未定义的而不是光标。服务器端会执行以下操作:
Meteor.methods({
'Things.search'( searchString ) {
check(searchString, String);
process.on('unhandledRejection', r => console.log(r));
try {
let searchOptions = "$i";
let result = Things.find({
$or:[
{typeOfThing:{ $regex: searchString, $options: searchOptions }},
{name:{ $regex: searchString, $options: searchOptions }}]
});
return result;
} catch (exception) {
console.log( exception );
throw new Meteor.Error('500', exception);
}
},
});
在另一个论坛上的建议中,我添加了process.on()以揭示更多关于未处理的promise的底层信息。添加后,控制台还显示了以下额外信息:
RangeError: Maximum call stack size exceeded
I20180202-20:38:14.522(-5)? at Object.keys.forEach.key (packages/ejson/ejson.js:594:27)
I20180202-20:38:14.522(-5)? at Array.forEach (<anonymous>)
I20180202-20:38:14.525(-5)? at Object.EJSON.clone.v [as clone] (packages/ejson/ejson.js:594:18)
I20180202-20:38:14.527(-5)? at Object.keys.forEach.key (packages/ejson/ejson.js:595:22)
I20180202-20:38:14.528(-5)? at Array.forEach (<anonymous>)
I20180202-20:38:14.530(-5)? at Object.EJSON.clone.v [as clone] (packages/ejson/ejson.js:594:18)
I20180202-20:38:14.549(-5)? at Object.keys.forEach.key (packages/ejson/ejson.js:595:22)
I20180202-20:38:14.551(-5)? at Array.forEach (<anonymous>)
I20180202-20:38:14.553(-5)? at Object.EJSON.clone.v [as clone] (packages/ejson/ejson.js:594:18)
I20180202-20:38:14.554(-5)? at Object.keys.forEach.key (packages/ejson/ejson.js:595:22)
使用chrome服务端调试器与Meteor 1.6一起使用后,我确认在ejson.js中存在一个无限循环。
看起来像是不属于我的错误 -- 我怀疑find()不应该陷入无限循环。有人对此有什么想法吗?
process.on('unhandledRejection', r => console.log(r));
会导致问题 - 基本上每次调用该方法时都会添加错误处理程序,并且在方法完成后没有将其删除。 - Mikkel