2016-06-27 47 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