首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Meteor mongo find() UnhandledPromiseRejectionWarning,超出了最大调用堆栈大小

Meteor mongo find() UnhandledPromiseRejectionWarning,超出了最大调用堆栈大小
EN

Stack Overflow用户
提问于 2018-02-07 01:42:33
回答 1查看 825关注 0票数 5

在我的meteor应用程序中查找mongodb时,我遇到了一个奇怪的错误。控制台中显示的错误为:

代码语言:javascript
复制
(node:20388) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2):
RangeError: Maximum call stack size exceeded

我在googled上搜索并找到了几个类似的实例,但我的情况不同,并且与数据大小无关--这是一个非常简单的查询,无论查询内容是什么,都会发生。

在客户端,我这样做:

代码语言:javascript
复制
Meteor.call( 'Things.search', searchString,(error,result) => {
      if(error){
        console.log(error);
      } else {
        console.log("Got result");
        ...

它立即从服务器端返回,没有错误,结果是未定义的,而不是游标。服务器端执行以下操作:

代码语言:javascript
复制
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()来揭示更多关于潜在的未处理的承诺。添加之后,控制台还显示了以下附加信息:

代码语言:javascript
复制
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)

在Meteor1.6中使用chrome服务器调试器时,我确认了ejson.js中存在无限循环。

这似乎是一个不属于我的bug --我怀疑find()是否应该进入无限循环。有人知道这是怎么回事吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-07 01:49:30

我找到了一半的答案和一个变通办法,但现在它似乎更有可能是一个bug。如果我只在服务器端执行fetch(),而不是尝试返回游标,它就能正常工作!所以,这是可行的:

代码语言:javascript
复制
  let result = Things.find({
    $or:[
      {typeOfThing:{ $regex: searchString, $options: searchOptions }},
      {name:{ $regex: searchString, $options: searchOptions }}]
    }).fetch(); // <--- This fetch makes it all work fine!

如果没有.fetch(),结果会立即返回为无效(如调试器中所示),因为它会在无限循环中崩溃。

因此,我通过返回fetch()结果来解决这个问题。不返回fetch()结果是我的错误,但不这样做会导致无法报告有用的错误消息并进入无限循环。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48648924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档