【问题标题】:Meteor Method: I keep getting a insert failed:Access Denied error on the ConsoleMeteor 方法:我不断收到插入失败:控制台上的访问被拒绝错误
【发布时间】:2016-02-12 00:58:21
【问题描述】:

我无法弄清楚为什么会出现此错误。我创建了一个流星方法。也许我只需要第二双眼睛并指出我的错误。我正在创建一个即时消息应用程序,在线用户可以在其中进行一对一聊天。只要我点击在线用户(路由)。控制台立即有一个

插入失败:访问被拒绝。

如果我尝试发送消息,这就是我得到的错误。

j…y.Event {originalEvent:事件,类型:“提交”,时间戳: 1455207989065,jQuery1112075371492956765:真,其中:未定义...} meteor.js:862 插入失败:访问被拒绝 meteor.js:862 更新 失败:访问被拒绝 17799meteor.js:862 插入失败:访问被拒绝

我对 Meteor 非常陌生,非常感谢任何帮助或建议。

这是我的 HTML

    <template name="chat_page">
    <h2>Type in the box below to send a message!</h2>
    <div class="row">
        <div class="col-md-12">
            <div class="well well-lg">
            {{#each messages}}
            {{> chat_message}}
            {{/each}}
            </div>  
        </div>
    </div>
    <div class="row">
        <div class="col-md-12">
            <form class="js-send-chat">
            <input class="input" type="text" name="chat" placeholder="type a message here...">
            <button class="btn btn-default">send</button>
        </form>
        </div>
    </div>
</template>

<!-- simple template that displays a message -->
<template name="chat_message">
    <div class = "container">
        <div class = "row">
            <img src="/{{profile.avatar}}" class="avatar_img">
            {{username}} said: {{text}}
        </div>
    </div>  
    <br>
</template>

客户端

Template.chat_page.helpers({
    messages:function(){
      var chat = Chats.findOne({_id:Session.get("chatId")});
      return chat.messages;
    }, 
    other_user:function(){
      return ""
    }, 

  });

 Template.chat_page.events({
  'submit .js-send-chat':function(event){
    console.log(event);
    event.preventDefault();
    var chat = Chats.findOne({_id:Session.get("chatId")});
    if (chat){
      var msgs = chat.messages; 
      if (!msgs){
        msgs = [];
      }
      msgs.push({text: event.target.chat.value});
      event.target.chat.value = "";
      chat.messages = msgs;
      Chats.update(chat._id, chat);
      Meteor.call("sendMessage", chat);
    }
  }
 })

方法

Meteor.methods({
  sendMessage: function (chat) {
    Chats.insert({
      chat: chat,
      createdAt: new Date(),
      username: Meteor.user().profile.username,
      avatar: Meteor.user().profile.avatar,
    });
  },
});

【问题讨论】:

  • 如果您阅读了一份好的入门文档就好了!!检查我们的meteortips.com/book.pdf
  • 嘿,谢谢。这会很有帮助。

标签: meteor methods access-denied


【解决方案1】:

你还有不安全和自动发布的包吗?

  Chats.update(chat._id, chat);

这部分对我来说似乎有点奇怪。 对集合的基本更新是:Chats.update({_id : chat._id}, {$set : {message : whateverMymsgis }}); Meteor 对更新方法有点严格,你总是需要传递 _id 来更新一些东西。

如果您没有自动发布和不安全的软件包,您是否已将所有允许/发布/订阅部分添加到您的收藏中??

希望它会有所帮助:)

【讨论】:

  • 谢谢你,我也听取了你的建议,但更新了 Chats.update 但我可能做错了,因为我收到了一个新错误。也就是说,更新失败:访问被拒绝。不允许在方法“更新”的受限集合上设置验证器。我把它改成了 Chats.update({_id : chat._id}, {$set : {message : msgs}});
【解决方案2】:

发生这种情况是因为您删除了insecure 包并且没有为您的chat 集合指定任何allow/deny,而且您的meteor 方法已写在client 一侧。

快速而适当的解决方案是将您的流星方法移至server side

【讨论】:

  • 谢谢,我采纳了你的建议,将方法移到服务器端,并添加了允许。单击用户时不再收到错误消息,但在尝试发送消息时收到新错误消息。也就是说,更新失败:访问被拒绝。不允许在方法“更新”的受限集合上设置验证器。
  • Chats.allow({ insert: function(userId, doc) { // 仅在登录后才允许发帖 return !! userId; } });
  • 我还更改了我的事件下的 Chats.update。 Chats.update({_id : chat._id}, {$set : {message : msgs}});
  • 就像insert 你也需要为你的update 设置allow/deny 规则,否则会抛出错误。或者您可以随时将您的 update code 转换为单独的 server side 方法并在客户端中调用该方法。
  • 感谢 Faysal,我能够在阅读您的评论之前进行这些更改,并且不再出现错误。但是,我还有另一个问题。在我的输入表单上单击发送后,它根本不会出现。不知道为什么,但我一直在研究它。如果您有任何想法,那将非常有帮助。
猜你喜欢
  • 2012-09-27
  • 1970-01-01
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多