所以,这个问题已经有了很好的记录,但在这里,我再次陷入困境......
在服务器端,我发布了:
Meteor.publish('userData', function(){ if (!this.userId) { return null; }
return Meteor.users.find({}, {fields: {'profile': 1}}); });
在客户端路由器订阅上,我有:
this.register('userData', Meteor.subscribe('userData'));
然后在我的客户端代码中,我有:
if (Meteor.userId()) {
var profile = Meteor.users.find(Meteor.userId()).profile;
console.log(profile); // I keep getting undefined...
我没有使用autopublish或不安全的软件包。
我在mongodb集合中的数据如下:
{"_id" : "...", profile: { "password" : { "network" : "...", "picture" : "none" } }
我的错误说:
Uncaught TypeError: Cannot read property 'password' of undefined
思想?
答案 0 :(得分:1)
用户配置文件会自动发布到客户端,您无需编写自定义发布来发送它。这就是为什么你永远不应该在配置文件中存储敏感的用户信息。你可以摆脱那个出版物。
要访问组件中的配置文件,您只需将组件(或整个应用程序)包装在将配置文件发送到组件的数据容器中。你这样做的原因是容器是被动的,所以组件将加载直到流星用户对象准备好,然后你可以立即访问存储在配置文件中的东西。
创建容器:
import { Meteor } from 'meteor/meteor';
import { createContainer } from 'meteor/react-meteor-data';
import { Navigation } from '/imports/ui/components/user-navigation/Navigation';
export default createContainer(() => {
const loading = !Meteor.user();
const user = Meteor.user();
return { loading, user };
}, Navigation);
访问组件中的个人资料:
import React, { Component } from 'react';
export class Navigation extends React.Component {
constructor(props) {
super(props);
}
render() {
const { user, loading } = this.props;
return (
loading ? <Loading /> :
<div className="navigation">
User's name is: { user.profile.firstname }
</div>
)
}
};
答案 1 :(得分:0)
我认为问题在于查询
var profile = Meteor.users.find({_id: Meteor.userId()}).profile;
或者这也应该起作用
var profile = Meteor.user().profile;
答案 2 :(得分:0)
因此,事实证明,我的大多数代码都是正确的,但正如上面指出的ghybs,我仍然需要等待用户数据。所以,这是我的工作代码:
// in publish.js on the server
Meteor.publish('userData', function(){ if (!this.userId) { return null; }
return Meteor.users.find({_id: this.userId}, {fields: {'profile': 1}}); });
// in routes.jsx using FlowRouter
// after importing all the module external data
FlowRouter.route('/',{subscriptions:function(){
this.register('getUser', Meteor.subscribe('userData'));
}, action() {
mount(...etc...
// Keep in mind that I am using TrackerReact NPM to handle re-renders...
// in my component
if (FlowRouter.subsReady("getUser")) {
// this returns an array with one object
var userObject = Meteor.users.find({_id: Meteor.userId()}).fetch()[0];
答案 3 :(得分:0)
尝试替换
var profile = Meteor.users.find({_id: Meteor.userId()}).profile;
与
var profile = Meteor.users.findOne({_id: Meteor.userId()}).profile;