Meteor - 缺少用户名Meteor.users.findOne();或Meteor.users();

时间:2015-05-03 16:24:04

标签: javascript meteor

提交帖子后,似乎无法识别当前用户,并且用户名显示为空白。提交html有{{author}}来显示撰写帖子的用户。

当我在控制台中键入以下内容时,会显示结果:

1)user.username

=>结果user未定义。

2)Meteor.users.find();

=> LocalCollection.Cursor {collection: LocalCollection, sorter: null, _selectorId: undefined, matcher: Minimongo.Matcher, skip: undefined…}

3)Meteor.users.findOne();

=> Object {_id: "P3ocCTTdvi2o3JApf", profile: Object}

与工作版本相比(注意我的版本缺少用户名)

=> Object {_id: "XHXPebzjg5LM5tNAu", profile: Object, username: "Bruno"}

在post.js集合中(在lib文件夹中 - 与客户端和服务器共享),我有:

Meteor.methods({
  postInsert: function(postAttributes) {
    check(this.userId, String);           //check(Meteor.userId(), String);
    check(postAttributes, {
      title: String,
      message: String
    });
    var user = Meteor.user();
    var post = _.extend(postAttributes, {
      userId: user._id, 
      author: user.username
    });
    var postId = Posts.insert(post);
    return {_id: postId};
  },

在Discover Meteor教程中也没有其他对author的引用,并且它有效。然而,我的工作不起作用。添加UserAccounts包后,似乎已经开始出现此问题。或者可能是文件夹位置问题?

更新[2015年5月11日]

我意识到在使用Meteor附带的原始ui-accounts时,它有username字段,因为{{> login}}附带的注册链接使用用户名+密码。没有电子邮件地址。

另一方面,

UserAccounts没有此用户名字段。它的电子邮件/ pw或社交登录。所以也许有人指导我如何从电子邮件/ pw和社交网络按钮登录/登录作为开始使用用户名(作为单独的字段或从电子邮件派生)?然后,我试图摆弄那里。

用户帐户的

代码

router.js

//Iron router plugin to ensure user is signed in
AccountsTemplates.configureRoute('ensureSignedIn', {
  template: 'atTemplate',     //template shown if user is not signed in
  layoutTemplate: 'atLayout'  //template for login, registration, etc
});

Router.plugin('ensureSignedIn', { //Don't require user logged in for these routes
  except: ['login', 'register']   //can use only: too 
});

AccountsTemplates.configureRoute('signIn', {  //login
  name: 'login',
  path: '/login',
  template: 'atTemplate',
  layoutTemplate: 'atLayout',
  redirect: '/'
});

AccountsTemplates.configureRoute('signUp', {  //registration
  name: 'register',
  path: '/register',
  template: 'atTemplate',
  layoutTemplate: 'atLayout',
  redirect: '/'
});

并在config.js(服务器端)下

2 个答案:

答案 0 :(得分:2)

从Useraccounts文档中,试试这个:

if (Meteor.isServer){
    Meteor.methods({
        "userExists": function(username){
            return !!Meteor.users.findOne({username: username});
        },
    });
}

AccountsTemplates.addField({
    _id: 'username',
    type: 'text',
    required: true,
    func: function(value){
        if (Meteor.isClient) {
            console.log("Validating username...");
            var self = this;
            Meteor.call("userExists", value, function(err, userExists){
                if (!userExists)
                    self.setSuccess();
                else
                    self.setError(userExists);
                self.setValidating(false);
            });
            return;
        }
        // Server
        return Meteor.call("userExists", value);
    },
});

这会将用户名字段添加到您的登录/注册表单中,并在注册新用户时检查用户名冲突。

顶部是服务器代码,底部是公共代码,因此您可以将整个代码段放在project / lib /文件夹中,或者将方法与其余方法一起放置,具体取决于您的项目结构。< / p>

使用以下内容在注册表单中首先显示用户名字段而不是最后一个:

var pwd = AccountsTemplates.removeField('password');
AccountsTemplates.removeField('email');
AccountsTemplates.addFields([
  {
    _id: "username",
    type: "text",
    displayName: "username",
    required: true,
    func: function(value){
      if (Meteor.isClient) {
        console.log("Validating username...");
        var self = this;
        Meteor.call("userExists", value, function(err, userExists){
          if (!userExists)
            self.setSuccess();
          else
            self.setError(userExists);
          self.setValidating(false);
        });
        return;
      }
      // Server
      return Meteor.call("userExists", value);
    },
    minLength: 5,
  },
  {
    _id: 'email',
    type: 'email',
    required: true,
    displayName: "email",
    re: /.+@(.+){2,}\.(.+){2,}/,
    errStr: 'Invalid email',
  },
  pwd
]);

https://github.com/meteor-useraccounts/core/blob/master/Guide.md

答案 1 :(得分:1)

您提供的信息很少,无法发现您的问题。 这就是说,你如何让你的用户进入?

请注意,OAuth注册不会在创建的用户对象上提供username字段,也不会仅基于电子邮件地址提供密码注册。在这些情况下,user.username将为undefined

我建议您确保所有用户都获得profile.username(可能利用某些Accounts.onLogin挂钩或某个配置文件页面,以强制用户选择用户名。

在此之后,您将扩展帖子元数据设置author: user.profile.username