使用流星方法,但仍然得到错误

Using Meteor Methods but still getting error

本文关键字:错误 流星 方法      更新时间:2023-09-26

我使用Meteor方法来避免在客户端更新数据库,但仍然得到这个错误:

Uncaught Error: Not allowed。不受信任的代码只能通过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);
          }
        }
      });
    }

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

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

  1. 将方法定义放在应用程序/server目录下的文件中。
  2. 将方法定义封装在if (Meteor.isServer) {}块中。

实际的错误发生是因为该方法正在客户端上运行(见上文),并且使用非基于id的选择器更新集合。例如:

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

而在客户端你只能做这样的更新:

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

如果您希望保留延迟补偿并编写客户端存根,您可以这样做,但您需要修改您的更新,如上面第二个示例所示。

建议阅读:构建你的应用程序

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