0

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

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/],并返回正确的结果。但是当我从路由器传递数组时,我无法让查询正常工作。请参阅下图中数组的调试内容。第二个和第三个图像是客户端/服务器调试内容,指示客户端和服务器上的相同内容,并且与我在查询中对数组进行硬编码时相同。

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

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

4

2 回答 2

1

/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
} 

这确保客户端不会为发布状态等待不必要的长时间,因为您已成功确保在任何(输入)情况下,您返回了其中之一false或 aCursor并且两者之间没有任何内容(如惊奇undefineds、未填充的游标、其他垃圾数据。

于 2014-11-19T04:13:03.960 回答
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);
});

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

于 2014-11-19T14:09:48.607 回答