2017-10-19 7 views
0

Je veux obtenir les données de tous les utilisateurs enregistrés dans meteorJS. D'après le Doc de meteorJS et stackOverflow, dans la fonction de rendu j'ai essayé quelques méthodes (les résultats sont comme validés). Je reçois seulement un tableau vide ou objet quand j'ai Abonnez-vous réellement 2 comptes d'utilisateurs db.users:Récupérer les données de tous les utilisateurs enregistrés dans météore Js

résultat de 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

Peut-être que quelqu'un connaît le problème. Merci d'avance.

Code sur le client:

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

dans le serveur:

import { Meteor } from 'meteor/meteor'; 

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

Répondre

1

Vous êtes abonné à votre 'AllUsers' au sein de la méthode render de votre composant:

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

Ce n'est pas le bon chemin et induit plusieurs problèmes. Tout d'abord, vous devez vérifier votre abonnement, si c'est ready avant de pouvoir utiliser les données via Meteor.users.find.

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

Mais même si vous le faire comme indiqué ci-dessus, votre méthode render peut être appelé à nouveau avant même que votre abonnement est prêt. La méthode de rendu est là uniquement pour le rendu et non pour la gestion des données.

Vous devriez vérifier comment utiliser createContainer à create a container for Meteor subscriptions et de transmettre ces données à votre composant. Cela rend également vos composants plus réutilisables et plus faciles à tester (car les données requises sont injectées via des accessoires).

+0

Je vais essayer. Merci beaucoup. –