我已经搜索并阅读了与Meteor的pub / sub功能相关的几乎所有问题,但似乎无法找到直接解决我问题的答案。
我正在学习Meteor并希望创建以下内容;
用户访问某个页面并显示一个输入框,他们输入了他们的用户名,如果是有效的用户名,我会用密码输入字段显示它们。
我似乎遇到的问题是我无法访问Meteor.users集合,除非我已登录(自动发布和不安全的软件包已被删除)。
所以我的问题是2折;
是否可以在不登录的情况下访问Meteor.users.find({username:'输入框的值'})?
如果是这样,我需要做什么?
以下是我在下面编写代码的方法;
/server/publications.js:
Meteor.publish("staff", function () {
return Meteor.users.find();
});
/lib/router.js:
Router.configure({
layoutTemplate: 'layout'
});
Router.map(function() {
this.route('home', {path: '/', data: function() {return Meteor.subscribe('staff');} });
});
/client/views/home/home.js:
Template.home.events({
'submit form': function(e) {
e.preventDefault();
var guest = $("input#name");
var staffMember = Meteor.users.findOne({username: $(guest).val()});
});
除非我以任何用户身份登录,否则Meteor.users.find()。fetch()始终返回一个空数组。非常感谢任何帮助。
答案 0 :(得分:1)
您正在向所有人发布所有用户数据,现在您只需要将其包含在内:
Deps.autorun(function(){
Meteor.subscribe('staff');
});
也就是说,确保在此类订阅中您只发布非敏感用户数据,因为每个人都可以看到它。理想情况下,为此目的创建另一个订阅,并通过fields
param。
答案 1 :(得分:1)
您要发布在客户端上可见的所有用户。这不是一个非常安全的位置,因为所有用户数据都将在所有客户端上可见。解决问题的实用方法是允许用户仅查看有限数量的用户,即发布一组不同的用户,具体取决于userId
。
正如@ Hubert在下面的回答所示,您还需要订阅到客户端上的发布,以实际获取已发布的帐户。
您可以通过在服务器上创建Method call来检查有效性安全:
<强> /server/methods.js:强>
Meteor.method({
validUserName: function (userName) {
check(userName, string);
// You have access to Meteor.users here.
// This assumes that mere existence of a user with the same username will
// render the entered username invalid. If there are more checks you want to
// make, they should be made here.
return !!Meteor.users.find({username: userName});
}
});
<强> /client/views/home/home.js:强>
Template.home.events({
'submit form': function(e) {
e.preventDefault();
var guest = $("input#name");
var userNameEntered = $(guest).val();
Session.set('requestInProgress', true);
Meteor.call('validUserName', function (isUserNameValid) {
Session.set('requestInProgress', false);
// ... take action here.
});
});