Javascript 试图从集合中获取随机游标-错误:发布函数只能返回游标或游标数组

Javascript 试图从集合中获取随机游标-错误:发布函数只能返回游标或游标数组,javascript,mongodb,meteor,Javascript,Mongodb,Meteor,我试图从一系列问题中随机发布一个问题。然而,我得到一个错误声明:error:Publish函数只能返回一个游标或游标数组。我如何更改下面的出版物,以便输出一个随机问题 Publications.js Meteor.publish('randomQuestions', function(){ var randomInRange = function(min, max) { var random = Math.floor(Math.random() * (max - min + 1)) +

我试图从一系列问题中随机发布一个问题。然而,我得到一个错误声明:error:Publish函数只能返回一个游标或游标数组。我如何更改下面的出版物,以便输出一个随机问题

Publications.js

Meteor.publish('randomQuestions', function(){
var randomInRange = function(min, max) {
    var random = Math.floor(Math.random() * (max - min + 1)) + min;
    return random;
};
var q = Questions.find().fetch();
var count = q.length;
var i = randomInRange(0, count);
return q[i]
});
路由器.js

this.route('gamePage', {
 path: '/games',
 waitOn: function() {
     return [
         Meteor.subscribe('randomQuestions'),
     ];
 }
});
这是客户端的一个助手,用于获取随机问题

Template.gamePage.helpers({
    displayRandomQuestion:
        function() {
            return Questions.find({});
        }
});
最后是使用helper函数的html/css

<div class="questions">
    {{#each displayRandomQuestion}}
      {{> questionItem}}
    {{/each}}
</div>

{{{每个问题}
{{>questionItem}
{{/每个}}

您可以为单个随机问题返回光标

Meteor.publish('randomQuestion', function (seed) {
  var q = _.sample(Questions.find().fetch());
  return Questions.find({_id: q && q._id});
});
您还应该使用随机种子进行订阅,以确保客户端不共享同一发布。下面的示例要求您
meteor添加random

this.route('gamePage', {
 path: '/games',
 waitOn: function() {
   return Meteor.subscribe('randomQuestion', Random.id());
 }
});
然后,您可以在助手中返回该问题

Template.gamePage.question = function() {
  return Questions.findOne();
};
并提供该数据作为模板的上下文

<div class="question">
  {{> questionItem question}}
</div>

{{>问题项问题}

这是一个儿童游泳池问题,但是为什么您使用q&&q.\u id而不是仅仅使用q.\u id?如果
q
未定义(从Minimongo获取的反应性数据可能会发生这种情况),那么使用
q.\u id
将引发异常
q&&q.\u id
产生相同的结果,并且是安全的。