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

Javascript Meteor-缺少用户名Meteor.users.findOne();或者Meteor.users();,javascript,meteor,Javascript,Meteor,提交帖子后,当前用户似乎无法识别,用户名显示为空。提交html有{author}来显示写文章的用户 以下是我在控制台中键入以下内容时的结果: 1用户用户名 =>结果用户未定义。 2Meteor.users.find; =>LocalCollection.Cursor{collection:LocalCollection,sorter:null,_selectorId:undefined,matcher:Minimongo.matcher,skip:undefined…} 3 Meteor.us

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

以下是我在控制台中键入以下内容时的结果:

1用户用户名 =>结果用户未定义。 2Meteor.users.find; =>LocalCollection.Cursor{collection:LocalCollection,sorter:null,_selectorId:undefined,matcher:Minimongo.matcher,skip:undefined…} 3 Meteor.users.findOne; =>对象{u id:P3ocCTTdvi2o3JApf,profile:Object}

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

=>对象{u id:XHXPebzjg5LM5tNAu,配置文件:对象,用户名:Bruno}

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

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};
  },
在《发现流星》教程中也没有其他关于作者的参考资料,而且它很有效。但是我的不行。这个问题似乎是在我添加UserAccounts包之后开始的。或者可能是文件夹位置问题

更新[2015年5月11日]

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

另一方面,UserAccounts没有此用户名字段。它要么是电子邮件/pw,要么是社交登录。所以,也许有人会指导我如何将用户名作为单独的字段,或者从email/pw和社交网络按钮login/sign中派生出用户名作为开始?那我就试着从那里拉小提琴

用户帐户代码 路由器.js

在config.js服务器端下,您需要使用.s访问对象的属性,而不是空间

Meteor.users.findOne
您需要使用.s来访问对象的属性,而不是空间

Meteor.users.findOne

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

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

我建议确保您的所有用户都获得一个profile.username,可能是利用一些Accounts.onLogin钩子或一些profile页面强制用户选择用户名


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

您只提供了很少的信息来发现您的问题。 也就是说,你是如何让你的用户进来的

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

我建议确保您的所有用户都获得一个profile.username,可能是利用一些Accounts.onLogin钩子或一些profile页面强制用户选择用户名


在此之后,您将从Useraccounts文档扩展post元数据设置author:user.profile.username

,尝试以下操作:

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/文件夹中,或者将该方法与其他方法放在一起,具体取决于您如何构建项目

使用以下命令使用户名字段首先显示在注册表表单上,而不是最后一个:

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
]);

在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/文件夹中,或者将该方法与其他方法放在一起,具体取决于您如何构建项目

使用以下命令使用户名字段首先显示在注册表表单上,而不是最后一个:

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
]);

不要包含图片,请尝试包含代码,可能还有回复的注释。当您直接在控制台中执行{{expr}}操作时,大括号无法解释对象文字,因此会变成代码块。这意味着它几乎和做expr完全一样。i、 e.您试图在控制台中访问的作者使用的是香草JavaScript,而不是meteor。@PaulS。我的错。让我删除{{expr}上的部分。至于代码,由于DeVooT没有抛出错误,我不确定代码的哪部分要考虑粘贴。我搜索了所有具有{{author}}或用户的部分,因此只粘贴了集合中的部分。您对从何处开始查找或使用其他工具等有何建议?请尝试在回答中包含代码和注释,而不是包含图像。当您直接在控制台中执行{{expr}}操作时,花括号将失败
因此,对象文字解释将变为代码块。这意味着它几乎和做expr完全一样。i、 e.您试图在控制台中访问的作者使用的是香草JavaScript,而不是meteor。@PaulS。我的错。让我删除{{expr}上的部分。至于代码,由于DeVooT没有抛出错误,我不确定代码的哪部分要考虑粘贴。我搜索了所有具有{{author}}或用户的部分,因此只粘贴了集合中的部分。您对从何处开始查找或使用其他工具等有何建议?很抱歉出现错误,您是正确的。安置,修改我的职位如上。有什么建议我应该在代码中查找问题吗?很抱歉出现了错误,您是正确的。安置,修改我的职位如上。有什么建议我应该在代码中查找问题吗?我使用的是UserAccounts:。以前,ui帐户将直接连接。这是否意味着UserAccounts需要手动连接?嗯,UserAccounts只不过是Accounts包提供的功能而已。它只是简单地调用Accounts.loginWith和类似的,就是这样。我不确定accounts ui是否会在基本包中添加更多功能:我会说不@splendiido ui accounts版本不需要accounts.loginWith或任何profile.username,登录正常。因此,我不确定需要为UserAccounts插入什么。请您提供一个更详细的描述,说明您正在做什么,以及您正在尝试实现什么?谢谢@splendido-我正在尝试实现UserAccounts。我意识到我可能遗漏了用户名字段,这解释了为什么最初的用户界面帐户版本有用户名字段,而我的用户帐户版本没有用户名字段。我需要了解如何在登录/注册中包含该字段,或者如何解决上述问题。没有其他错误消息,所以我自己也不确定还要写什么。我正在使用UserAccounts:。以前,ui帐户将直接连接。这是否意味着UserAccounts需要手动连接?嗯,UserAccounts只不过是Accounts包提供的功能而已。它只是简单地调用Accounts.loginWith和类似的,就是这样。我不确定accounts ui是否会在基本包中添加更多功能:我会说不@splendiido ui accounts版本不需要accounts.loginWith或任何profile.username,登录正常。因此,我不确定需要为UserAccounts插入什么。请您提供一个更详细的描述,说明您正在做什么,以及您正在尝试实现什么?谢谢@splendido-我正在尝试实现UserAccounts。我意识到我可能遗漏了用户名字段,这解释了为什么最初的用户界面帐户版本有用户名字段,而我的用户帐户版本没有用户名字段。我需要了解如何在登录/注册中包含该字段,或者如何解决上述问题。没有其他错误消息,所以我自己也不确定还要在这里写什么