2015-09-16 125 views
1

爲什麼我會在客戶端和服務器端獲得不同的結果?在客戶端,它始終是1.如果我登錄,是否重要?如果是這種情況,如何在登錄時獲取所有數據?流星:服務器和客戶端上的用戶數不同

Console Server: Users.find().count() = 7 
Console Client: Users.find().count() = 1 

共享/ collections.js

Users = Meteor.users; 

客戶機/ router.js

Router.route('/users', { 
    name: 'users', 
    data: function() { 
     return { 
      usersAll: Users.find({}) 
     } 
    } 
}); 

模板

<template name="users"> 
    <ul class="list"> 
     {{#each usersAll}} 
      <li><a href="/user/{{_id}}">{{profile.name}}</a></li> 
     {{/each}} 
    </ul> 
</template> 

在模板中我只得到一個結果。

回答

2

是的,您登錄時無關緊要。您必須發佈和訂閱客戶端上的數據。如果您嘗試在客戶端上執行Meteor.users.find(),則您將始終返回當前活動的用戶。 (如果有的話)

如果您在服務器上執行Meteor.users.find(),您將返回所有用戶,無論發佈/訂閱如何。這是一種安全防範措施,以防止普通用戶訪問客戶端上的私人信息。

如果您願意,可以向客戶發佈更多或更少的數據。檢查這篇文章出來: https://www.meteor.com/tutorials/blaze/publish-and-subscribe

或文檔: http://docs.meteor.com/#/full/meteor_publish

如果要發佈的所有數據,您可以隨時添加autopublish包。儘管這不是生產應用程序的建議。

服務器

Meteor.publish('allUsers', function(){ 
    return Meteor.users.find(); 
}); 

客戶

Template.users.onCreated(function(){ 
    var instance = this; 

    instance.autorun(function(){ 
     var allUsers = instance.subscribe('allUsers'); 
    }); 
}); 

Template.users.helpers({ 
    'usersAll': function(){ 
     return Meteor.users.find().fetch(); 
    } 
}); 
+0

但我怎麼都可以發佈和訂閱。如果我這樣做,我會得到錯誤,該用戶已經發布/訂閱。你能舉個例子嗎? – user3142695

+0

但是,如果我現在想更新這個usersAll集合中的一個條目,那麼我得到錯誤'insert failed:Access denied'。雖然我設置了Users.allow(); – user3142695

+0

發佈和訂閱數據僅與顯示數據相關。如果你想現在操縱數據庫,那完全不一樣了。請調查和研究stackoverflow,我相信你會找到你需要的。如果沒有,請發佈一個包含所有相關代碼的新問題,我很樂意提供幫助。 – ndcomix