向Meteor用户帐户添加更多字段

use*_*575 34 user-accounts meteor

我正在使用mrt add accounts-ui-bootstrap-dropdownmrt add accounts-password在我的应用程序上运行一个简单的登录页面.

帐户用户给了我一个很好的哈希,包含id,createdAt,电子邮件等.

如果我想在此哈希中添加其他字段,以便稍后可以使用它们,我该怎么做?例如,我想要输入他们的名字和姓氏:

"given_name":"John","姓":"Doe"

fab*_*ien 40

用户是流星中的特殊对象; 您不希望在用户中添加字段,而是在用户配置文件中添加字段.

来自doc:

By default the server publishes username, emails, and profile.
Run Code Online (Sandbox Code Playgroud)

如果要在创建帐户时添加surname等属性,则应在Account.onCreateUser服务器端钩子中使用:http://docs.meteor.com/#accounts_oncreateuser

Accounts.onCreateUser(function(options, user) {
    //pass the surname in the options

    user.profile['surname'] = options.surname

    return user
}
Run Code Online (Sandbox Code Playgroud)

如果您想在之后更新用户,可以通过以下方式从客户端进行更新:

Meteor.users.update({_id:Meteor.user()._id}, { $set: {what you want to update} });
Run Code Online (Sandbox Code Playgroud)

默认情况下,用户群将允许(当前用户可以自行更新).如果您不信任您的用户并希望确保所有内容都正确更新,您也可以禁止客户端的任何更新,并通过a Meteor.call()进行更新,然后继续进行检查服务器端.但这会很难过.


编辑:

如评论中所述,通过标准帐户ui添加选项是不可能的.您只能在注册后更新用户.要在订阅时添加选项,您必须自己创建表单.

我不会通过编写html标记来侮辱你,但这是你想要在提交事件之后(以及在各种检查之后)拥有的内容:

var options = {
    username: $('input#username')[0].value,
    emails: [{
        address: $('input#email')[0].value,
        verified: false
    }],
    password: $('input#password')[0].value,
    profile: {
        surname: $('input#surname')
    },
};
Accounts.createUser( options , function(err){
    if( err ) $('div#errors').html( err.message );
});
Run Code Online (Sandbox Code Playgroud)

您只需要基于帐户的包; 不是帐户 - ui.

登录社交网络是蛋糕:

Meteor.loginWithFacebook({
    requestPermissions: ['email', 'user_birthday', 'user_location']
}, function(error){loginCallBack(error);});
Run Code Online (Sandbox Code Playgroud)

关于ram1的答案:

这不是流星的工作方式.您没有"发布"表单.您希望通过websocket完成所有客户端/服务器通信.你所说的相当于从客户端制作一个服务器方法的"Meteor.call('myserverfunction',myarguments,mycallback)",并传递你希望服务器使用的参数.

但这并不是你获得最好的流星的方式.您希望与之合作的理念是:

  1. 你从服务器获得的本地迷你mongo中有数据
  2. 您在本地更新基础/视图中的数据
  3. 流星将他的魔力传递给服务器
  4. 在那里服务器可以回答:好的,更新已保存,这对您来说是无缝的.或回答:nop!反转更改(您可以实现错误通知系统)

(它可以回答否,因为您没有更新此字段的权限,因为此更新违反了您设置的规则...)

您所要做的就是在数据库服务器端设置权限和控制.这样,当一个诚实的客户进行更新时,他会立即看到结果; 在将其推送到服务器并发送给其他客户端之前的方式.这是延迟补偿,是流星的七大原则之一.

如果您通过Meteor.call修改数据,您将这样做:

  1. 将更新发送到服务器
  2. 服务器检查并更新基础
  3. 服务器将更新发送给客户端(包括您)
  4. 您的本地基础更新和您的视图更新=>您会看到您的更新

=>这就是你昨天的应用程序; meteor允许你构建一个今天的应用程序.不要应用旧食谱:)


小智 13

接受的答案如何正确,但WHERE是过时的信息.(是的,作为对答案的评论会更好,但我还不能这样做.)

Meteor 1.2文档中:

将自定义数据存储到Meteor.users集合的最佳方法是在用户文档上添加一个新的唯一命名的顶级字段.

关于使用Meteor.user.profile存储自定义信息:

不要使用个人资料

当一个新用户注册时,默认情况下会添加一个名为profile的诱人现有字段.此字段历来用作用户特定数据的暂存区 - 可能是其图像头像,名称,介绍文本等.因此,每个用户的配置文件字段可由该用户从客户端自动写入.它也会自动发布给该特定用户的客户端.

基本上,在配置文件字段中存储名称,地址,dob等基本信息可能很好,但不能存储超出该信息的任何内容,因为默认情况下,它可以由客户端写入并且容易受到恶意用户的攻击.


小智 11

我有同样的问题,并设法只做Accounts.createUser:

Accounts.createUser({
    email: email,
    password: password,
    profile: {
            givenName: 'John',
            surname: 'Doe',
            gender: 'M'
        }
}
Run Code Online (Sandbox Code Playgroud)

这是非常简单的方式,它的工作原理.只需在配置文件部分添加所需的变量即可.希望它可以帮助某人.