【问题标题】:Adding more fields to Meteor user accounts向 Meteor 用户帐户添加更多字段
【发布时间】:2014-06-23 19:34:26
【问题描述】:

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

帐户用户给了我一个不错的哈希值,其中包含 id、createdAt、电子邮件等。

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

"given_name": "John", "surname": "Doe"

【问题讨论】:

    标签: meteor user-accounts


    【解决方案1】:

    用户是流星中的特殊对象;您不想在用户中添加字段,而是在用户个人资料中添加字段。

    来自文档:

    By default the server publishes username, emails, and profile.
    

    如果您想在创建帐户时添加姓氏等属性,则应在 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
    }
    

    如果你想在之后更新用户,你可以从客户端这样做:

    Meteor.users.update({_id:Meteor.user()._id}, { $set: {what you want to update} });
    

    默认情况下,用户群将允许这样做(当前用户可能会自行更新)。如果您不信任您的用户并希望确保一切都正确更新,您还可以禁止来自客户端的任何更新并通过Meteor.call() 进行更新,然后继续检查服务器端。但这将是可悲的。


    编辑:

    正如 cmets 中所说,无法通过标准 account-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 );
    });
    

    您只需要基于帐户的软件包;不是帐户用户界面。

    使用社交网络登录是小菜一碟:

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

    关于 ram1 的回答:

    这不是流星的工作方式。您不会“发布”表单。您希望通过 websocket 完成所有客户端/服务器通信。您所说的等价物是从客户端创建服务器方法的“Meteor.call('myserverfunction', myarguments, mycallback)”,然后传递您希望服务器使用的参数。

    但这不是你能充分利用流星的方式。有你想使用的哲学:

    1. 您的本地 mini mongo 中有您从服务器获取的数据
    2. 您在本地更新基础/视图中的这些数据
    3. meteor 施展魔法将这些更新传输到服务器
    4. 服务器可以回答:好的,更新已保存,这对您来说是无缝的。或者回答:不!撤消更改(您可以实施错误通知系统)

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

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

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

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

    => 这是你昨天应用程序中的内容;流星允许您构建今天的应用程序。不要使用旧的食谱:)

    【讨论】:

    • 这是一个很好的答案。但是,我要提供的警告是,正如您所指出的,OP 需要将options 参数传递给客户端Accounts.createUser 调用,但是如果他依赖accounts-ui-bootstrap-dropdown,这可能并非完全微不足道。包,它可能会为他处理这个电话。我不熟悉这个包,无论如何都会有一个简单的方法来解决这个问题(即使它涉及分叉),但我认为他需要比你建议的更多地挖掘包。
    • 如果用户在注册的时候要添加字段,就得自己制作注册表;基础包中的标准不会轻易做到这一点。只是因为它需要添加字段。我编辑我的答案来解释如何:)
    • 似乎只有当被调用的方法纯粹存储在服务器代码中时,这种对 Meteor.call 的解释才是正确的。将这些方法放在您的 lib 帐户中,以便它们在客户端和服务器上都可用,并且延迟补偿应该可以正常工作。 :) 否则你可以进入允许/拒绝规则,虽然这看起来实际上比调用同构 Meteor 方法更混乱。
    【解决方案2】:

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

    来自Meteor 1.2 documentation

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

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

    ?不要使用个人资料

    有一个诱人的现有字段,名为 profile,由 新用户注册时的默认值。这个领域在历史上 旨在用作用户特定数据的便笺簿 - 也许 他们的形象头像、姓名、介绍文字等。因此, 每个用户的配置文件字段都可以由该用户自动写入 从客户端。它也会自动发布给客户端 那个特定的用户。

    基本上,在个人资料字段中存储姓名、地址、出生日期等基本信息可能没问题,但存储除此之外的任何内容不是一个好主意,因为默认情况下,客户端可写入且易受攻击给恶意用户。

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,只用Accounts.createUser就成功了:

      Accounts.createUser({
          email: email,
          password: password,
          profile: {
                  givenName: 'John',
                  surname: 'Doe',
                  gender: 'M'
              }
      }
      

      这是非常简单的方法,并且有效。只需在配置文件部分添加所需的变量,它就应该准备好了。希望它可以帮助某人。

      【讨论】:

      • 这很有效。我猜profile是默认可以自定义的文件。
      • 谢谢,在投票最多的答案中使用 email 而不是 emails 数组解决了我的问题
      【解决方案4】:

      我最终使用了https://atmospherejs.com/joshowens/accounts-entry,它提供了一个extraSignUpFields config 选项。

      【讨论】:

        【解决方案5】:

        来自文档 (https://github.com/ianmartorell/meteor-accounts-ui-bootstrap-3/blob/master/README.md):

        自定义注册选项

        您可以定义其他输入字段以显示在注册表单中,并且您可以决定是否将这些值保存到用户文档的配置文件对象中。使用 Accounts.ui.config 指定字段数组,如下所示:

        Accounts.ui.config({
            requestPermissions: {},
            extraSignupFields: [{
                fieldName: 'first-name',
                fieldLabel: 'First name',
                inputType: 'text',
                visible: true,
                validate: function(value, errorFunction) {
                  if (!value) {
                    errorFunction("Please write your first name");
                    return false;
                  } else {
                    return true;
                  }
                }
            }, {
                fieldName: 'last-name',
                fieldLabel: 'Last name',
                inputType: 'text',
                visible: true,
            }, {
                fieldName: 'gender',
                showFieldLabel: false,      // If true, fieldLabel will be shown before radio group
                fieldLabel: 'Gender',
                inputType: 'radio',
                radioLayout: 'vertical',    // It can be 'inline' or 'vertical'
                data: [{                    // Array of radio options, all properties are required
                    id: 1,                  // id suffix of the radio element
                    label: 'Male',          // label for the radio element
                    value: 'm'              // value of the radio element, this will be saved.
                  }, {
                    id: 2,
                    label: 'Female',
                    value: 'f',
                    checked: 'checked'
                }],
                visible: true
            }, {
                fieldName: 'country',
                fieldLabel: 'Country',
                inputType: 'select',
                showFieldLabel: true,
                empty: 'Please select your country of residence',
                data: [{
                    id: 1,
                    label: 'United States',
                    value: 'us'
                  }, {
                    id: 2,
                    label: 'Spain',
                    value: 'es',
                }],
                visible: true
            }, {
                fieldName: 'terms',
                fieldLabel: 'I accept the terms and conditions',
                inputType: 'checkbox',
                visible: true,
                saveToProfile: false,
                validate: function(value, errorFunction) {
                    if (value) {
                        return true;
                    } else {
                        errorFunction('You must accept the terms and conditions.');
                        return false;
                    }
                }
            }]
        });
        

        【讨论】:

          【解决方案6】:

          官方 Meteor Guide 通过示例代码提供了全面的答案:

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

          https://guide.meteor.com/accounts.html#custom-user-data

          【讨论】:

            猜你喜欢
            • 2015-02-12
            • 2016-04-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-30
            • 2022-01-03
            相关资源
            最近更新 更多