失败:对meteor collection的访问被拒绝

失败:对meteor collection的访问被拒绝,meteor,Meteor,此Meteor应用程序已删除不安全和自动发布,并添加了帐户密码。 它使用Accounts.createUser({username:someName,password:somePwrd})可在mongo提示符上验证 我正在尝试Tasks1.insert(params)和访问被拒绝 我不知道为什么它在浏览器控制台上的更新和插入被拒绝访问。请告诉我为什么以及如何修复它?谢谢 //both.js Tasks1 = new Mongo.Collection('tasks1'); ////////////

此Meteor应用程序已删除不安全和自动发布,并添加了帐户密码。
它使用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;iTasks1.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,});