2016-06-27 44 views
0

订阅不返回结果我有以下代码:流星发布和使用选择

import { Meteor } from 'meteor/meteor'; 
import { Items } from './collection'; 

    if (Meteor.isServer) { 
     Meteor.publish('items', function(options, owner) { 

     let selector = { 
      $and: [{ ownerId: owner}] 
     } 

     return Items.find(selector, options); 

     }); 
    } 

而在客户端,我有:

this.subscribe('items',() => [{ 
     limit: this.getReactively('querylimit'), 
     sort: {dateTime: -1} 
    }, 
    this.getReactively('ownerId') 
    ]); 

以上不返回任何结果。但是,当我将return语句更改为以下内容时,它可以工作!

return Items.find({ ownerId: '7QcWm55wGw69hpuy2' }, options); //works !!! 

我不是很熟悉Mongo/Meteor查询选择器。将查询作为变量传递给Items.find()似乎在搞乱某些东西。有人可以帮我解决这个问题!

谢谢

回答

0

您试图传递一个函数作为选择器,这是行不通的。函数不能被序列化并从客户端发送到服务器。相反,您需要分别评估optionsowner。这里有一个例子:

var owner = this.getReactively('ownerId'); 
var options = { 
    limit: this.getReactively('querylimit'), 
    sort: {dateTime: -1} 
}; 

this.subscribe('items', options, owner); 

注意,发布的文件将不会arrive in sorted order,所以,除非您使用的是limit,该sort不会在这里帮助。

另请注意,如果您需要在所有者或查询限制更改后重新运行订阅,则需要在autorun之内订阅。

这里有一个改进的实施开始:

Meteor.publish('items', function(options, owner) { 
    // DANGER! Actually check this against something safe! 
    check(options, Object); 

    // DANGER! Should any user subscribe for any owner's items? 
    check(owner, Match.Maybe(String)); 

    // Publish the current user's items by default. 
    if (!owner) { 
    owner = this.userId; 
    } 

    return Items.find({ ownerId: owner }, options); 
}); 
+0

感谢。我现在在手机上,所以我现在无法检查。但是,我想知道为什么我能够在服务器端使用console.log来打印参数。 console.log(selector)打印我在第二个return语句中粘贴的ownerId字符串。 – Neo

+0

我误解了原来的问题并做了一些修改。 –

+0

再次感谢,但是这似乎并没有解决问题 – Neo