获取流星Js

时间:2017-10-19 13:00:13

标签: meteor publish-subscribe

我想获取meteorJS中所有注册用户的数据。根据meteor的meteorJS和stackOverflow,在渲染函数中我尝试了一些方法(结果如提交所示)。当我在db.users中实际拥有2个用户帐户时,我只收到一个空数组或订阅对象:

db.users.find()

的结果
{ "_id" : "uFdKrgSyeBr6msxsH", "createdAt" : ISODate("2017-10-19T12:35:26.930Z"), "services" : { "password" : { "bcrypt" : "$2a$10$.LP2ftnNFDNx1gB7ouaMZ.OwXWLk89iDL6qjOuc.CVebtR/ziiv1K" }, "resume" : { "loginTokens" : [ ] } }, "username" : "AAA" }
{ "_id" : "sJXS2YZ3vENHK2TYT", "createdAt" : ISODate("2017-10-19T12:35:46.266Z"), "services" : { "password" : { "bcrypt" : "$2a$10$TMbeew0aQ/L71YCHjSMoveyf3Kj7Vf0uNnZc7D0OnVtze.ZcuuoE6" }, "resume" : { "loginTokens" : [ { "when" : ISODate("2017-10-19T12:35:46.274Z"), "hashedToken" : "4WpMPUrqydYyKSStCWayBVubNKhgUiLmRio7N1902mg=" } ] } }, "username" : "BBB" }

https://github.com/LeMueller/meteor_react_chatroom

也许有人知道这个问题。提前谢谢。

客户端代码:

import React, {Component} from 'react';
import ReactDOM from 'react-dom';
import { Meteor } from 'meteor/meteor';
import {DialogServer} from './dialogServer.js';

export default class SendArea extends Component{

    constructor(props){
        super(props);
    }

    handleSubmit(event) {
        event.preventDefault();

        // Find the text field via the React ref
        const text = ReactDOM.findDOMNode(this.refs.textInput).value.trim();

        if(Meteor.userId())

        DialogServer.insert({
            text: text,
            owner: Meteor.userId(),           // _id of logged in user
            username: Meteor.user().username,  // username of logged in user
            createdAt: new Date(), // current time
        });

        // Clear form
        ReactDOM.findDOMNode(this.refs.textInput).value = '';
    }

    render(){
         let allUsersDate=Meteor.subscribe('allUsers'); //{subscriptionId: "4nHErSSjJLJesWJcq", stop: ƒ, ready: ƒ}
         let allUsersD = Meteor.users.find({}).fetch(); //Array(0)
        return(
          <div>
            <form className="new_message" onSubmit={this.handleSubmit.bind(this)}>
                <input type='text' ref="textInput" placeholder="message to send"/>
                <button onClick={this.handleSubmit.bind(this)}>send</button>
            </form>
          </div>
        )
     }
}
服务器中的

代码:

import { Meteor } from 'meteor/meteor';

Meteor.startup(() => {
  Meteor.publish('allUsers', function(){
    return Meteor.users.find({},{
        fields:{
            _id:1,
            username:1
        }
    });
  });
});

1 个答案:

答案 0 :(得分:1)

您订阅了所有用户&#39;在组件的渲染方法中:

let allUsersDate=Meteor.subscribe('allUsers'); //{subscriptionId: "4nHErSSjJLJesWJcq", stop: ƒ, ready: ƒ}
let allUsersD = Meteor.users.find({}).fetch(); //Array(0)

这不是正确的方法,并引发了一些问题。首先,您需要先检查您的订阅,如果它是ready,然后才能通过Meteor.users.find使用这些数据。

let allUsersDate=Meteor.subscribe('allUsers');
if (allUsersDate.ready()) {
    let allUsersD = Meteor.users.find({}).fetch(); // will return all users
}

但即使您如上所示,即使您的订阅准备就绪,也可能会再次调用render方法。 render方法仅用于渲染而不是数据处理。

您应该查看如何使用createContainercreate a container for Meteor subscriptions并将此数据传递给您的组件。这也使您的组件更易于重用且更易于测试(因为所需数据是通过props注入的)。