我想获取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
}
});
});
});
答案 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方法仅用于渲染而不是数据处理。
您应该查看如何使用createContainer
到create a container for Meteor subscriptions并将此数据传递给您的组件。这也使您的组件更易于重用且更易于测试(因为所需数据是通过props注入的)。