2017-10-19 4 views
0

meteorJSに登録されているすべてのユーザーのデータを取得します。私はいくつかのメソッドを試してみました(結果はコミットされたものです)。 db.users.findの流星Jsに登録されているすべてのユーザーのデータを取得

結果(たぶん誰かが問題を知っている

{ "_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

):私は実際にdb.usersで2つのユーザーアカウントを持っているとき、私は空の配列またはsubscribtionオブジェクトを受け取ります。前もって感謝します。

クライアント上のコード:サーバーで

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

コード:これはない

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

import { Meteor } from 'meteor/meteor'; 

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

答えて

1

あなたは、コンポーネントのレンダリングメソッド内であなたの 'ALLUSERS' に加入しています正しい方法で、いくつかの問題を引き起こします。まず、Meteor.users.findでデータを利用するには、readyの場合は、購読を確認する必要があります。

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

しかし、あなたが上記のように、あなたのrender方法は、サブスクリプションの準備ができていても前に再び呼び出されることができることを行うだろうしても。レンダリングメソッドは、レンダリング用であり、データ処理用ではありません。

createContainercreate a container for Meteor subscriptionsの使用方法を確認し、このデータをコンポーネントに渡す必要があります。これにより、コンポーネントの再利用性が向上し、テストが容易になります(必要なデータが小道具によって注入されるため)。

+0

私はそれを試みます。どうもありがとう。 –

関連する問題