使用Meteor方法但仍然出错

时间:2015-07-15 16:36:29

标签: javascript angularjs meteor

我使用Meteor methods来避免在客户端更新数据库但仍然收到此错误:

  

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

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

    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);
          }
        }
      });
    }
编辑:我应该提一下,即使出现该错误,该应用程序仍然可以在localhost上正常工作,但是当我将其部署到某个测试服务器时,它仍无效(并且仍然显示错误)。

2 个答案:

答案 0 :(得分:2)

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

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

    Posts.update({awesome: false}, {...});
    

    在客户端上,您只能进行以下更新:

    Posts.update(postId, {...});
    

    如果您希望保留latency compensation并编写客户端存根,则可以,但您需要修改更新,如上面第二个示例所示。

    建议阅读:Structuring your application

答案 1 :(得分:1)

发现它来自我的accounts-ui配置,完全不同的文件!