【问题标题】:Meteor mongo find() UnhandledPromiseRejectionWarning, maximum call stack size exceededMeteor mongo find() UnhandledPromiseRejectionWarning,超出最大调用堆栈大小
【发布时间】:2018-02-06 17:42:32
【问题描述】:

我在我的流星应用程序中执行 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() 以揭示更多关于底层未处理承诺的信息。添加后,控制台还显示了以下附加信息:

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() 应该进入无限循环。有人对此有想法吗?

【问题讨论】:

  • 返回 find().fetch() 因为方法不是响应式的,应该只返回数据。对于反应性数据观察,您应该使用我们的出版物。
  • 很高兴知道,谢谢!这是我第一次尝试传回游标而不使用发布。我错过了你不应该尝试这个的地方。不过,我觉得它应该更优雅地失败。
  • 我知道我已经在 GitHub 上打开了一个关于错误消息完全令人困惑的问题。
  • 我不确定设置 process.on('unhandledRejection', r =&gt; console.log(r)); 是否会导致问题 - 基本上每次调用该方法时您都会添加错误处理程序,而不是在方法完成时删除它跨度>
  • 这并没有造成任何伤害。我只是在遇到问题后才添加它,以便我可以获得更多错误信息(它确实给了我,如上所示)。

标签: mongodb meteor


【解决方案1】:

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

  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() 结果是我的错误,但这是一个流星问题,不这样做无法报告有用的错误消息并进入无限循环。

【讨论】:

  • 这是正确的。您不能将游标发送到客户端,但需要返回获取的文档的方法。这是由于 Meteor 在内部处理集合和游标的方式。
  • 我正在使用事件从方法访问数据。然后我想对这个返回的数据调用 Collection Helper 方法。但是,我不能在获取的 Doc bc 上这样做,因为它不是游标,对吧?有解决方法吗?谢谢!
  • @user2402616 不确定 - 您可能需要为此打开一个单独的问题。
猜你喜欢
  • 2020-07-13
  • 2015-10-31
  • 1970-01-01
  • 1970-01-01
  • 2015-10-24
  • 2015-12-29
  • 2017-12-27
  • 2020-12-06
  • 2018-02-06
相关资源
最近更新 更多