Javascript 使用Meteor方法但仍会出错

Javascript 使用Meteor方法但仍会出错,javascript,angularjs,meteor,Javascript,Angularjs,Meteor,我正在使用以避免在客户端更新数据库,但仍然会出现以下错误: 未捕获错误:不允许。不受信任的代码只能按ID删除文档。[403] 在为accounts ui包配置Facebook和Twitter登录之前,我没有注意到它会影响应用程序。同样,我在客户端执行的唯一数据库操作是finds if(Meteor.isClient) { $scope.deleteTask = function(task) { $meteor.call("deleteTask&quo

我正在使用以避免在客户端更新数据库,但仍然会出现以下错误:

未捕获错误:不允许。不受信任的代码只能按ID删除文档。[403]

在为accounts ui包配置Facebook和Twitter登录之前,我没有注意到它会影响应用程序。同样,我在客户端执行的唯一数据库操作是finds

    if(Meteor.isClient) {
      $scope.deleteTask = function(task) {
        $meteor.call("deleteTask", task._id);
      };
    }
    
    if(Meteor.isServer) {
      Meteor.methods({
        deleteTask: function (taskId) {
          var task = Tasks.findOne(taskId);
          if (task.owner !== Meteor.userId()) {
            alert("Only a tasks owner may delete the task.")
            throw new Meteor.Error("not-authorized");
          }
          else {
            Tasks.remove(taskId);
          }
        }
      });
    }

编辑:我应该提到,即使出现了错误,应用程序在本地主机上仍然可以正常工作,但当我将其部署到meteor的一个测试服务器时,它不工作(并且仍然显示该错误)。

您正在客户机上运行代码。您有两种选择可以立即解决问题:

  • 将方法定义放在应用程序中
    /server
    目录下的文件中
  • 将方法定义包装在
    if(Meteor.isServer){}
    块中
  • 发生实际错误的原因是该方法正在客户端上运行(请参见上文),并使用非基于id的选择器更新集合。例如:

    Posts.update({awesome: false}, {...});
    
    而在客户端上,您只能进行如下更新:

    Posts.update(postId, {...});
    
    如果您希望保留并编写客户端存根,您可以这样做,但您需要修改更新,如上面第二个示例所示


    建议阅读:。

    发现它来自一个完全不同的文件中的我的帐户ui配置

    你能发布你的方法调用和方法本身吗?我已经在上面添加了一些代码。我已经将所有数据库操作包装在“if(Meteor.isServer){}”中,但仍然得到错误。尝试我的第一个建议,并将其放在
    /server
    目录下的文件中。您的文件中可能存在其他一些不相关的问题,只是没有正确地对此进行评估。还要确保执行此操作后,客户端上没有剩余的第二个定义。如果仍然出现错误,但错误文本已更改,请指出。我已将所有服务器代码移动到
    /server
    目录下的文件中,但仍然出现相同的错误。尽管出现了该错误,但这些操作仍然可以在localhost上运行,但当我将其部署到meteor的一个测试服务器时,应用程序无法运行。您需要在代码中搜索
    deleteTask
    。在localhost上的web控制台中,您仍然可以在客户端上获取该代码的唯一方法是,如果您有仍然向客户端公开的方法的第二个定义。如果你有一个回购协议,我可以检查,我很高兴有一个快速查看。发现它是从我的帐户界面配置在一个完全不同的文件!