javascript - 使用 meteor 方法但仍然出现错误

标签 javascript angularjs meteor

我正在使用 Meteor methods避免在客户端更新数据库但仍然出现此错误:

Uncaught Error: Not permitted. Untrusted code may only remove documents by 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) {} block 中。

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

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

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

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

如果你喜欢保留latency compensation并尽可能编写一个客户端 stub ,但您需要修改您的更新,如上面第二个示例所示。

推荐阅读:Structuring your application .

关于javascript - 使用 meteor 方法但仍然出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31436155/

相关文章:

AngularJS HTML5 模式在手动 url 更改时重新加载整个页面

javascript - 在 AngularJS 和非 AngularJS 弹出窗口之间共享变量

angularjs - 无法让 ng-animate 移除 ng-hide

每次查询后 meteor 掉落收集

meteor - 解析来自 Sendgrid 的入站电子邮件

javascript - 使用 JavaScript 返回超过 1 个数组值

javascript - 如何删除以特定字符开头的行

javascript - IntelliJ IDEA 2017.1 设置中缺少 Javascript 库菜单

javascript - 对Rails集成使用react

linux - 在 linux 服务器中为 meteor 创建一个启动脚本