失败:对meteor collection的访问被拒绝
此Meteor应用程序已删除不安全和自动发布,并添加了帐户密码。失败:对meteor collection的访问被拒绝,meteor,Meteor,此Meteor应用程序已删除不安全和自动发布,并添加了帐户密码。 它使用Accounts.createUser({username:someName,password:somePwrd})可在mongo提示符上验证 我正在尝试Tasks1.insert(params)和访问被拒绝 我不知道为什么它在浏览器控制台上的更新和插入被拒绝访问。请告诉我为什么以及如何修复它?谢谢 //both.js Tasks1 = new Mongo.Collection('tasks1'); ////////////
它使用Accounts.createUser({username:someName,password:somePwrd})代码>可在mongo提示符上验证 我正在尝试
Tasks1.insert(params)代码>和访问被拒绝
我不知道为什么它在浏览器控制台上的更新和插入被拒绝访问。请告诉我为什么以及如何修复它?谢谢
//both.js
Tasks1 = new Mongo.Collection('tasks1');
/////////////////////////////////////////////////////
//server.js
Meteor.publish('tasks1', function(){
return Tasks1.find({userId: this.userId});
});
Meteor.methods({
logMeIn: function(credentials) {
var idPin = credentials[0] + credentials[1];
Accounts.createUser({username: idPin, password: credentials[1]});
}
});
Meteor.users.allow({
insert: function (userId, doc) {
console.log(userId);
//var u = Meteor.users.findOne({_id:userId});
return true;
}
});
/////////////////////////////////////////////////////
//client.js
Template.login.events({
'click #logMe': function() {
var credentials = [$('#id').val(), $('#pin').val()];
Meteor.call('logMeIn', credentials, function(err, result) {
if (result) {
console.log('logged in!');
}
});
}
});
Template.footer.events({
'click button': function () {
if ( this.text === "SUBMIT" ) {
var inputs = document.getElementsByTagName('input');
for (var i = 0; i < inputs.length; i++) {
var params = {};
params[inputs[i].name] = inputs[i].value;
Tasks1.insert(params); //<<<<<<----------------------
}
}
}
});
//tware.js
Tasks1=新的Mongo.Collection('Tasks1');
/////////////////////////////////////////////////////
//server.js
Meteor.publish('tasks1',function(){
返回Tasks1.find({userId:this.userId});
});
流星法({
logMeIn:函数(凭据){
var idPin=凭证[0]+凭证[1];
Accounts.createUser({用户名:idPin,密码:凭据[1]});
}
});
Meteor.users.allow({
插入:函数(用户ID、文档){
console.log(userId);
//var u=Meteor.users.findOne({u id:userId});
返回true;
}
});
/////////////////////////////////////////////////////
//client.js
Template.login.events({
'click#logMe':函数(){
var凭证=[$('#id').val(),$('#pin').val();
Meteor.call('logMeIn',凭证,函数(err,result){
如果(结果){
console.log('logged in!');
}
});
}
});
Template.footer.events({
“单击按钮”:函数(){
如果(this.text==“提交”){
var inputs=document.getElementsByTagName('input');
对于(变量i=0;i Tasks1.insert(params);//定义Meteor.methods这样的方法将同时为服务器和客户端定义它。这意味着您将尝试创建一个用户两次,一次在服务器上(工作的)创建一个用户,另一次在客户端创建一个用户。客户端无权插入用户文档,因此您收到此错误
您有两个选择:
1:仅通过使用if(Meteor.isServer)
或将其放在名为“server”的文件夹中来定义服务器上的方法
2:保持原样,不会造成伤害,但会在控制台中不断显示错误
我确信有第三种解决方案,也可能有第四种解决方案,但我会使用这两种解决方案。更新:
由于您已经编辑了问题并添加了Tasks1.insert(params);
正在获取拒绝访问消息,因此您应该添加allow
有关任务的规则
集合,而不是Meteor.users
集合
Tasks.allow({
insert: function (userId, doc) {
return true;
},
update: function (userId, doc, fieldNames, modifier) {
return true;
},
remove: function (userId, doc) {
return true;
}
});
Meteor.users.allow({
insert: function (userId, doc) {
//Normally I would check if (this.userId) to see if the method is called by logged in user or guest
//you can also add some checks here like user role based check etc.,
return true;
},
update: function (userId, doc, fieldNames, modifier) {
//similar checks like insert
return true;
},
remove: function (userId, doc) {
//similar checks like insert
return true;
}
});
如果Accounts.createUser
在没有allow
有关Meteor.users
的规则的情况下工作,请删除它们,因为它可能允许用户从客户端本身插入/删除其他用户
更新结束。
由于您删除了不安全的
,因此需要添加allow/deny
规则来插入、更新或删除集合中的文件
Tasks.allow({
insert: function (userId, doc) {
return true;
},
update: function (userId, doc, fieldNames, modifier) {
return true;
},
remove: function (userId, doc) {
return true;
}
});
Meteor.users.allow({
insert: function (userId, doc) {
//Normally I would check if (this.userId) to see if the method is called by logged in user or guest
//you can also add some checks here like user role based check etc.,
return true;
},
update: function (userId, doc, fieldNames, modifier) {
//similar checks like insert
return true;
},
remove: function (userId, doc) {
//similar checks like insert
return true;
}
});
查看以了解更多详细信息。该方法是在server.js中定义的,您是指集合吗?这意味着您没有告诉我们所有人…我看到您更新了问题,并且您得到了答案,因此我不会更新我的答案。文件是否也在相应的目录中(服务器/客户端等)?您是否将用户密码以明文形式存储在数据库中作为用户名的一部分?对两个问题都是:)server.js
文件相对于项目根目录的路径是什么?appName/server/server.js那么我不明白为什么会发生这样的事情。可能还有另一个副作用没有在发布的代码中提到。你能创建一个最小的可复制示例并发布你得到的错误吗?另外,你为什么要创建一个用户ev每次有人提交表单时,您为什么要以明文形式存储密码?您应该在Tasks.allow中插入一个fetch条目。您可以查看附加的API文档了解更多信息。缩写:Tasks.allow({insert:(userId,doc)=>true,update:(userId,doc,fieldNames,modifier)=>true,删除:(userId,doc)=>true,});