javascript - Meteor.user() 没有在客户端显示自定义字段

标签 javascript mongodb meteor meteor-accounts

我在创建帐户时为我的用户添加自定义字段,发布字段并订阅该出版物,但我的 Meteor.user().customField 将无法在客户端访问.

因此,在我的 imports/api/users/users.js 中,我添加了以下代码段:

import { Random } from 'meteor/random'
Accounts.onCreateUser((options, user) => {
    const cond = assignUserCondition();
    user.enterTime= new Date();
    user.page = null;
    user.passedQuiz= false;
    user.exitStatus=null;
    user.quizAttempts= 0;
    user.condition= cond;
    user.avatar= null;
    user.score= 0;
    user.bonus= 0;
    user.lobbyTimeout= LOBBY_TIMEOUT;
    user.gameId= null;
    user.condInfo = {name: cond,
        groupSize: (cond+'GROUPS_SIZE').split('.').reduce((o, i) => o[i], CONDITIONS_SETTINGS),
        bonusConversion: (cond+'BONUS_CONVERSION').split('.').reduce((o, i) => o[i], CONDITIONS_SETTINGS),
        N_ROUNDS: (cond+'N_ROUNDS').split('.').reduce((o, i) => o[i], CONDITIONS_SETTINGS),
    };
    return user;
});

然后,我从 meteor mongo 验证创建的用户确实具有我添加的新自定义字段。现在,在 imports/api/users/server/publications.js 中,我有以下片段:

import {Meteor} from 'meteor/meteor'
Meteor.publish('users.user', function(currentUser) {
    let user=  Meteor.users.find({_id:currentUser}, {
        fields: {
            _id: 1,
            enterTime: 1,
            page: 1,
            passedQuiz: 1,
            exitStatus: 1,
            quizAttempts:1,
            condition:1,
            avatar: 1,
            score:1,
            bonus: 1,
            lobbyTimeout: 1,
            gameId: 1,
            conditionInfo: 1
        }
    });
    if ( user ) {
        return user;
    }
    return this.ready();
});

此外,在我的 imports/startup/client/index.js 中我有订阅:

Tracker.autorun(function(){
    Meteor.subscribe('users.user');
});

然而,在客户端,console.log(Meteor.user()) 只显示了 _idusername 而没有任何我的自定义字段。

最佳答案

您没有在 subscribe 中从客户端传入 currentUser 参数。然而,这是一个严格的禁忌,因为客户端不受信任(有人可以轻松地将不同用户的 _id 发送到您的方法)。将您的出版物重写为:

import {Meteor} from 'meteor/meteor'
Meteor.publish('users.user', function() {
  if (this.userId) {
    return Meteor.users.find(this.userId, {
      fields: {
        _id: 1,
        enterTime: 1,
        page: 1,
        passedQuiz: 1,
        exitStatus: 1,
        quizAttempts:1,
        condition:1,
        avatar: 1,
        score:1,
        bonus: 1,
        lobbyTimeout: 1,
        gameId: 1,
        conditionInfo: 1
      }
    });
  }
  return this.ready();
});

关于javascript - Meteor.user() 没有在客户端显示自定义字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45848768/

相关文章:

javascript - 有人能告诉我为什么 json2.js 不能解析这个字符串吗?

javascript - 为什么这个简单的内容 slider 不起作用?

javascript - 异步系列 : variable number of callbacks

spring - 非默认端口上的Docker-compose,spring app + mongoDB

javascript - 为什么我无法在 React 组件中访问我的 Mongo 集合?

javascript - 如何从 document.querySelectorAll() 正确循环遍历 NodeList?

javascript - 使用 browserify 需要 jQuery 和 lodash

reactjs - userData.name 未显示用户名

javascript - meteor 助手中未拾取 session 变量

javascript - Meteor 和 React 的双向数据绑定(bind)