Meteor mongo find() UnhandledPromiseRejectionWarning,超出最大调用堆栈大小
Meteor mongo find() UnhandledPromiseRejectionWarning, maximum call stack size exceeded
我在我的 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");
...
它returns立即从服务器端没有错误和结果
未定义而不是游标。服务器端这样做:
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() 以揭示更多关于潜在未处理承诺的信息。添加之后,控制台还显示了以下附加信息:
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)
使用带有 meteor 1.6 的 chrome 服务器调试器,我确认 ejson.js 中存在无限循环。
似乎不是我的错误 -- 我怀疑 find() 应该只是进入无限循环。有人对此有想法吗?
我找到了一半的答案和解决方法,但现在它似乎更有可能是一个错误。如果我只是在服务器端执行 fetch(),而不是尝试 return 光标,它工作正常!所以,这有效:
let result = Things.find({
$or:[
{typeOfThing:{ $regex: searchString, $options: searchOptions }},
{name:{ $regex: searchString, $options: searchOptions }}]
}).fetch(); // <--- This fetch makes it all work fine!
如果没有 .fetch()
,结果立即返回这里无效(如调试器中所示),因为它在无限循环中全部崩溃。
所以,我通过 returning fetch() 结果解决了这个问题。没有 return fetch() 结果是我的错误,但这是一个流星问题,不这样做无法报告有用的错误消息并进入无限循环。
我在我的 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");
...
它returns立即从服务器端没有错误和结果 未定义而不是游标。服务器端这样做:
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() 以揭示更多关于潜在未处理承诺的信息。添加之后,控制台还显示了以下附加信息:
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)
使用带有 meteor 1.6 的 chrome 服务器调试器,我确认 ejson.js 中存在无限循环。
似乎不是我的错误 -- 我怀疑 find() 应该只是进入无限循环。有人对此有想法吗?
我找到了一半的答案和解决方法,但现在它似乎更有可能是一个错误。如果我只是在服务器端执行 fetch(),而不是尝试 return 光标,它工作正常!所以,这有效:
let result = Things.find({
$or:[
{typeOfThing:{ $regex: searchString, $options: searchOptions }},
{name:{ $regex: searchString, $options: searchOptions }}]
}).fetch(); // <--- This fetch makes it all work fine!
如果没有 .fetch()
,结果立即返回这里无效(如调试器中所示),因为它在无限循环中全部崩溃。
所以,我通过 returning fetch() 结果解决了这个问题。没有 return fetch() 结果是我的错误,但这是一个流星问题,不这样做无法报告有用的错误消息并进入无限循环。