Meteor:错误:{{#each}}目前只接受数组,游标或falsey值

时间:2016-02-12 16:56:24

标签: debugging meteor console.log

单击发送按钮时,我不断收到此错误消息。我试图创建一个Instant Messenger应用程序,在线用户可以一对一聊天。我是初学者,我真的很感激任何帮助。这是我的错误消息,一旦我单击“发送”按钮,它就会出现在控制台中。

  

Tracker重新计算功能的异常:meteor.js:862错误:   {{#each}}目前只接受数组,游标或falsey值。       在badSequenceError(observe-sequence.js:148)       at observe-sequence.js:113       at Object.Tracker.nonreactive(tracker.js:597)       at observe-sequence.js:90       在Tracker.Computation._compute(tracker.js:331)       在Tracker.Computation._recompute(tracker.js:350)       at Object.Tracker._runFlush(tracker.js:489)       at onGlobalMessage(meteor.js:347)

这是我的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...">
        <input type="submit" value="Send">
      </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({ _id: chat._id }, { $set : { messages: chat } }); 
      Meteor.call("sendMessage", chat);
    }
  }
});

服务器端的部分

Meteor.publish("chats", function () { 
  return Chats.find(); 
});

Meteor.publish("userStatus", function () {
  return Meteor.users.find({ "status.online": true });
});

Meteor.publish("userData", function () {
  if (this.userId) {
    return Meteor.users.find({ _id: this.userId },{ fields: { 'other': 1, 'things': 1 } });
  } else {
    this.ready();
  }
  return Meteor.users.find({ "status.online": true });
});

Meteor.publish("users", function () {
  return Meteor.users.find({ "status.online": true });
});

Chats.allow({
  insert: function () { return true; },
  update: function () { return true; },
  remove: function () { return true; }
});

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

2 个答案:

答案 0 :(得分:0)

您订阅的机会尚未准备就绪。这意味着Chats.findOne()将不返回任何内容,这意味着Chats.findOne().messages将是未定义的。

尝试以下方法:

{{ #if Template.subscriptionsReady }}
  {{#each messages}}
  {{/each}}
{{/else}}

或者,在聊天中使用find(),然后在聊天中的消息上使用{{#each}}。例如:

Template['Chat'].helpers({
  chats: function () {
    return Chats.find(Session.get('chatId')); // _id is unique, so this should only ever have one result.
  }
});

然后在模板中:

{{#each chats}}
  {{#each messages}}
    {{>chat_message}}
  {{/each}}
{{/each}}

答案 1 :(得分:0)

我认为此行可能存在逻辑错误

Chats.update({ _id : chat._id }, { $set : { messages : chat } });

您要将字段messages的值设置为chat。但是chat是一个对象。因此,当您将Chats.findOne().messages返回到{{#each}}块时,在您的帮助器中,您实际上返回的对象不是一个有效值,而是要发送到{{#each}}块,因此会出错。

我认为你的意思是

Chats.update({ _id : chat._id }, { $set : { messages : msgs } });