获取meteor Js中所有注册用户的数据

获取meteor Js中所有注册用户的数据,meteor,publish-subscribe,Meteor,Publish Subscribe,我想获得meteorJS中所有注册用户的数据。根据meteorJS和stackOverflow的文档,在render函数中我尝试了一些方法(结果如commit所示)。当我在db中实际有2个用户帐户时,我只收到一个空数组或订阅对象。users: db.users.find()的结果 也许有人知道这个问题。提前谢谢 客户机上的代码: import React, {Component} from 'react'; import ReactDOM from 'react-dom'; import {

我想获得meteorJS中所有注册用户的数据。根据meteorJS和stackOverflow的文档,在render函数中我尝试了一些方法(结果如commit所示)。当我在
db中实际有2个用户帐户时,我只收到一个空数组或订阅对象。users

db.users.find()的结果

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

客户机上的代码:

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>
        )
     }
}

您正在组件的渲染方法中订阅“allUsers”:

let allUsersDate=Meteor.subscribe('allUsers')//{subscriptionId:“4nherssjljeswjcq”,停止:ƒ,准备:ƒ}
让allUsersD=Meteor.users.find({}).fetch()//数组(0)
这不是正确的方法,并导致了几个问题。首先,您需要检查订阅是否已准备就绪,然后才能通过
Meteor.users.find使用数据

let allUsersDate=Meteor.subscribe('allUsers');
if(allUsersDate.ready()){
让allUsersD=Meteor.users.find({}).fetch();//将返回所有用户
}
但是,即使您如上所示执行此操作,您的
render
方法也可能在订阅准备就绪之前再次被调用。render方法仅用于渲染,不用于数据处理


您应该了解如何使用
createContainer
将此数据传递给组件。这也使您的组件更易于重用和测试(因为所需的数据是通过道具注入的)

我试试看。谢谢。
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
        }
    });
  });
});