2015-09-16 122 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