web-dev-qa-db-ja.com

Meteorユーザーアカウントにフィールドを追加する

使っています mrt add accounts-ui-bootstrap-dropdownおよびmrt add accounts-password私のアプリで実行されている簡単なログインページを取得します。

アカウントのユーザーは、id、createdAt、emailなどを含む素敵なハッシュを私にくれます。

後で利用できるようにこのハッシュに他のフィールドを追加したい場合、どうすればよいですか?たとえば、次に彼らの名と姓も入力したい:

「given_name」:「John」、「surname」:「Doe」

34
user1584575

ユーザーは、流星の特別なオブジェクトです。ユーザーではなくユーザープロファイルにフィールドを追加する必要があります。

ドキュメントから:

_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()を介して更新し、サーバー側のチェックに進むこともできます。しかし、これは悲しいでしょう。


編集:

コメントで述べたように、標準account-uiを介してオプションを追加することはできません。登録後にのみユーザーを更新できます。購読時にオプションを追加するには、独自のフォームを作成する必要があります。

Htmlマークアップを作成してyou辱するつもりはありませんが、submitイベントの後(およびさまざまなチェックの後)に必要なものを以下に示します。

_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 );
});
_

Account-baseパッケージのみが必要です。 account-uiではありません。

ソーシャルネットワークでのログインは簡単です:

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

ram1の回答について:

これは流星の仕組みではありません。フォームを「POST」しないでください。すべてのクライアント/サーバー通信がwebsocket経由で行われるようにします。あなたが話しているのと同等のものは、クライアントからサーバーメソッドの「Meteor.call( 'myserverfunction'、myarguments、mycallback)」を作成し、サーバーに使用させたい引数を渡すことです。

しかし、これは流星を最大限に活用する方法ではありません。協力したい哲学があります:

  1. サーバーから取得したローカルミニモンゴにデータがあります
  2. あなたのベース/ビューでそれらのデータをローカルで更新します
  3. 流星は、それらの更新をサーバーに送信するために彼の魔法を行います
  4. そこにサーバーが答えることができます:OK、更新が保存されました。これはあなたにとってシームレスです。または答え:nop!変更を元に戻します(エラー通知システムを実装できます)

(このフィールドを更新する権限がないため、この更新は設定したルールに違反するため、いいえと答えることができます...)

必要なことは、データベースのサーバー側で権限と制御を設定することだけです。そうすれば、正直なクライアントが更新を行うと、結果が即座に表示されます。サーバーにプッシュされ、他のクライアントに送信される前の方法。これは、レイテンシ補償、流星の7つの原則の1つです。

Meteor.callを使用してデータを変更する場合、次のようにします。

  1. サーバーに更新を送信する
  2. サーバーはベースをチェックして更新します
  3. サーバーは更新をクライアント(あなたを含む)に送信します
  4. ローカルベースの更新とビューの更新=>更新が表示されます

=>これは昨日のアプリにあったものです。流星は、今日のアプリを構築することができます。古いレシピを適用しないでください:)

40
fabien

受け入れられた回答にはHOW権利がありますが、WHEREは古い情報です。 (はい、これは答えに対するコメントとしては良いでしょうが、私はまだそれをすることはできません。)

Meteor 1.2ドキュメント から:

カスタムデータをMeteor.usersコレクションに保存する最良の方法は、一意の名前が付けられた新しいトップレベルフィールドをユーザードキュメントに追加することです。

そして、Meteor.user.profileを使用してカスタム情報を保存することに関して:

????プロファイルを使用しない

新しいユーザーが登録すると、デフォルトで追加されるprofileという魅力的な既存のフィールドがあります。このフィールドは、歴史的にユーザー固有のデータのスクラッチパッドとして使用することを目的としていました-画像アバター、名前、イントロテキストなど。このため、すべてのユーザーのプロファイルフィールドは、そのユーザーがクライアントから自動的に書き込み可能です。また、その特定のユーザーのクライアントに自動的に公開されます。

基本的に、プロファイルフィールドに名前、住所、dobなどの基本情報を保存することはおそらく問題ありませんが、それ以外のものを保存することはお勧めできません。デフォルトでは、クライアントが書き込み可能で、悪意のあるユーザーに対して脆弱です。 。

13
soisystems

私は同じ問題を抱えており、Accounts.createUser

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

それは非常に簡単な方法であり、動作します。プロファイルセクションに目的の変数を追加するだけで、準備が整います。それが誰かを助けることを願っています。

10

公式のMeteor Guideは、サンプルコードを含む包括的な回答を提供します。

カスタムデータをMeteor.usersコレクションに保存する最良の方法は、一意の名前が付けられた新しいトップレベルフィールドをユーザードキュメントに追加することです。

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

1
Amir Samakar

最終的に https://atmospherejs.com/joshowens/accounts-entry を使用することになり、extraSignUpFieldsconfigオプションが提供されます。

1
KindOfGuy

ドキュメントから( 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;
            }
        }
    }]
});
1
pmalbu