【问题标题】:What's wrong with my Meteor publication?我的 Meteor 出版物有什么问题?
【发布时间】:2015-01-16 11:25:39
【问题描述】:

我有一个出版物,基本上如下:

Meteor.publish('entity-filings', function publishFunction(cik, queryArray, limit) {

  if (!cik || !filingsArray)
    console.error('PUBLICATION PROBLEM');

  var limit = 40;


  var entityFilingsSelector = {};
  if (filingsArray.indexOf('all-entity-filings') > -1)
    entityFilingsSelector = {ct: 'filing',cik: cik};
  else
    entityFilingsSelector = {ct:'filing', cik: cik, formNumber: { $in: filingsArray} };


  return SB.Content.find(entityFilingsSelector, {
    limit: limit
  });


});

filingsArray 部分有问题。 filingsArray 是 Mongo $in 查询的正则表达式数组。我可以将出版物中的filingsArray 硬编码为[/8-K/],这会返回正确的结果。但是当我从路由器传递数组时,我无法让查询正常工作。请参阅下图中数组的调试内容。第二个和第三个图像是客户端/服务器调试内容,指示客户端和服务器上的相同内容,也与我在查询中对数组进行硬编码时相同。

我的问题是:我错过了什么?为什么我的查询不起作用,或者它不起作用的一些可能原因是什么?

【问题讨论】:

    标签: mongodb meteor meteor-publications


    【解决方案1】:

    在第一个屏幕截图中,这是一个看起来像正则表达式文字的字符串,而不是实际的 RegExp 对象。所以{$in: ["/8-K/"]} 只会匹配字面意义上的"/8-K/",这与{$in: [/8-K/]} 不同。

    正则表达式不是支持 EJSON 的对象,因此您将无法通过网络将它们作为发布函数参数或方法参数或方法返回值发送。我建议发送一个字符串,然后在发布函数中,使用new RegExp(...) 构造一个正则表达式对象。

    如果您愿意在 RegExp 原型上添加新方法,您可以尝试将 RegExp 设置为支持 EJSON 的类型,方法是将其放入您的服务器和客户端代码中:

    RegExp.prototype.toJSONValue = function () {
      return this.source;
    };
    
    RegExp.prototype.typeName = function () {
      return "regex";
    }
    
    EJSON.addType("regex", function (str) {
      return new RegExp(str);
    });
    

    完成此操作后,您应该能够使用正则表达式作为发布函数参数、方法参数和方法返回值。看到这个meteorpad

    【讨论】:

      【解决方案2】:

      /8-K/.. 这是一个奇怪的正则表达式。试试/8\-K/

      减号 (-) 是范围指示符,通常在方括号内使用。之所以奇怪,是因为你怎么能计算出 8 到 K 之间的范围?如果你不逃避它,它可能不会被用来匹配任何东西(因此你的查询将不起作用)。有时,它确实有效。安全总比没有好。

      /8\-K/ 匹配字符串"8-K" 一次......我假设你正在尝试这样做。

      如果你能确保你的出版物总是能返回一些东西,这也会有所帮助。这是一个你可能会失败的好地方:

      if (!cik || !filingsArray)
          console.error('PUBLICATION PROBLEM');
      

      如果没有填写这些参数,console.log 可能不是处理它的最佳方式。更好的方法:

      if (!cik || !filingsArray) {
           throw "entity-filings: Publication problem.";
           return false; 
      } else {
        // .. the rest of your publication
      } 
      

      这确保客户端不会为发布状态等待不必要的长时间,因为您已成功确保在任何(输入)情况下您返回 falseCursor 并且两者之间没有任何内容(例如惊喜 undefined s,未填充的Cursors,其他垃圾数据。

      【讨论】:

      • 嗨,这可能很好地解决了问题......但如果你能编辑你的答案并提供一些关于它如何工作以及为什么工作的解释会很好: ) 不要忘记——Stack Overflow 上有很多新手,他们可以从你的专业知识中学到一两件事——对你来说显而易见的事情对他们来说可能不是。
      • 我实际上已经尝试过了。问题是8-K 示例只是我尝试选择的多个事物中最简单的一个。但是,是的,我试过了。感谢您提供有关错误内容的额外输入
      • 您是否尝试过console.log-ing entityFilingsSelector.find 之前会输出什么?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多