尝试使用Meteor和React进行收藏

时间:2017-07-15 16:33:28

标签: mongodb reactjs meteor

我正在研究Meteor和React,我正在创建一个允许用户创建消息的小应用程序。很简单...但我无法摆脱加入集合。

我正在使用的是publish-composite来帮助我完成肮脏的工作,但我迷失了......

以下是目前的代码:

messages.js:

import { Meteor } from 'meteor/meteor';
import { publishComposite } from 'meteor/reywood:publish-composite';

export const Messages = new Mongo.Collection('messages');

if (Meteor.isServer) {
  publishComposite('messages', {
    find() {
      return Messages.find({}, {
        sort: { createdAt: -1 }
      });
    },
    children: [
      {
        find(message) {
          return Meteor.users.find(
            { _id: message._author }
          );
        }
      }
    ]
  });
}

在我的React组件中,我创建了这个:

componentDidMount() {
    this.messagesTracker = Tracker.autorun(() => {
      Meteor.subscribe('messages');
      const messages = Messages.find({}, {
        sort: { createdAt: -1 }
      }).fetch();
      console.log(messages);
      this.setState({ messages });
    });
  }

在publish-composite的文档中,我看到它使用Template.topTenPosts.helpers来获取数据,我不知道如何使用React来模拟它...

日志显示的只是没有任何用户信息的消息数据:

Object
createdAt:Sat Jul 15 2017 18:17:13 GMT+0200 (CEST)
message:"A message..."
_author:"6M8wNbt4Ff2YTN99u"
_id:"2gL2xKbWnduYqTHXk" 

我该怎样摆脱它?干杯

2 个答案:

答案 0 :(得分:0)

publish-composite不会执行真正的 join - 它会返回多个集合中的所有相关文档。您仍需要在客户端显示相关信息。在您的情况下,您正在显示消息,但您还需要显示作者信息。您的React组件必须访问两个集合才能显示每个集合的文档。

开始于:

componentDidMount() {
  this.messagesTracker = Tracker.autorun(() => {
    Meteor.subscribe('messages');
      const messages = Messages.find({}, {
        sort: { createdAt: -1 }
      }).fetch();
      const authors = Authors.find({}).fetch;
      this.setState({ messages, authors });
    });
  }

现在,您的组件可以访问其状态中的消息和(相关)作者。如果你展示你的渲染代码,那么我可以通过如何将各个部分放在你的布局中来增加这个答案。

答案 1 :(得分:0)

<强>解决方案

perak:joins是我用来使其正常工作的软件包,它非常易于使用:

messages.js:

[...]
export const Messages = new Mongo.Collection('messages');

Messages.join(Meteor.users, '_author', 'author', ['profile']);

if (Meteor.isServer) {
  Meteor.publish('messages', function() {
    return Messages.find({}, {
      sort: { createdAt: -1 }
    });
  });
}
[...]

componentDidMount没有变化,messages的结果是author对象填充的名为profile的新字段所期望的结果。