我有一份出版物,基本上是以下内容:
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/]
,并返回正确的结果。但是当我从路由器传递数组时,我无法使查询正常工作。请参见下图中的数组调试内容。第二个和第三个映像是客户端/服务器调试内容,指示客户端和服务器上的相同内容,也与我在查询中对数组进行硬编码时相同。
我的问题是:我错过了什么?为什么我的查询不起作用,或者它可能无法正常工作的原因是什么?
答案 0 :(得分: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
或Cursor
并且之间没有任何内容(例如惊讶undefined
s,未填充的游标,其他垃圾数据。
答案 1 :(得分:1)
在第一个屏幕截图中,这是一个看起来像正则表达式文字的字符串,而不是实际的RegExp
对象。因此{$in: ["/8-K/"]}
只会按字面"/8-K/"
匹配,这与{$in: [/8-K/]}
不同。
正则表达式不是具有EJSON功能的对象,因此您无法通过线路将它们作为发布函数参数或方法参数或方法返回值发送。我建议发送一个字符串,然后在发布函数中使用new RegExp(...)
来构造一个正则表达式对象。
如果您愿意在RegExp
原型上添加新方法,可以尝试将RegExp
设为EJSON-able类型,方法是将其放入您的服务器和客户端代码中:
RegExp.prototype.toJSONValue = function () {
return this.source;
};
RegExp.prototype.typeName = function () {
return "regex";
}
EJSON.addType("regex", function (str) {
return new RegExp(str);
});
执行此操作后,您应该能够将正则表达式用作发布函数参数,方法参数和方法返回值。请参阅此meteorpad。