流星:服务器和客户端上的用户数不同
问题描述:
为什么我会在客户端和服务器端获得不同的结果?在客户端,它始终是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>
在模板中我只得到一个结果。
答
是的,您登录时无关紧要。您必须发布和订阅客户端上的数据。如果您尝试在客户端上执行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();
}
});
但我怎么都可以发布和订阅。如果我这样做,我会得到错误,该用户已经发布/订阅。你能举个例子吗? – user3142695
但是,如果我现在想更新这个usersAll集合中的一个条目,那么我得到错误'insert failed:Access denied'。虽然我设置了Users.allow(); – user3142695
发布和订阅数据仅与显示数据相关。如果你想现在操纵数据库,那完全不一样了。请调查和研究stackoverflow,我相信你会找到你需要的。如果没有,请发布一个包含所有相关代码的新问题,我很乐意提供帮助。 – ndcomix