2017-12-04 5 views
1

내 Meteor 앱 사용자는 '수동으로'계정을 만들거나 accounts-facebook 패키지로 계정을 만들 수 있습니다.Meteor에서 다양한 구조의 사용자 데이터를 정규화하는 방법은 무엇입니까?

가 수동으로 다음 계정을 만드는 경우 데이터베이스에 자신의 이메일은 다음과 같이 저장됩니다

emails: [address: '[email protected]', verified: false] 

을하지만 그들은 다음 페이스 북의 로그인을 사용하는 경우는 다음과 같이 저장 :

services: { 
    facebook: { 
    email: "[email protected]" 
    } 
} 

내가 가진 사용자 이메일을 표시하고 변경 가능하게하는 사용자 계정 페이지. 다양한 구조를 어떻게 처리 할 수 ​​있습니까?

사용자의 이메일을 표시하기 위해이 React 구성 요소를 만들었습니다. 방금 기본 Meteor 사용자 프로필을 만들었지 만 props.user.email doenst가 존재하므로 Facebook 로그인에 오류가 추가되었습니다.

 <div className="form-primary__row"> 
      <label>Email:</label> 
      {props.user.emails.map((item, i) => { 
      return (
       <input defaultValue={item.address} key={i} name="email" /> 
      ); 
      })} 
     </div> 

이것은 사용자가 이메일을 업데이트하는 나의 방법입니다. 그것은 Meteors 계정을 가지고 있었지만 페이스 북에서 작동하지 않을 때도 효과가있었습니다.

Meteor.methods({ 
    'user.updateEmail'({ email }) { 
    Meteor.users.update(
     { _id: Meteor.userId() }, 
     { 
     $set: { 
      'emails.0.address': email, 
      'emails.0.verified': false, 
     }, 
     }, 
    ); 
    }, 
}); 
+0

매뉴얼 전자 메일을 유사한 구조 형식으로 저장하는 것은 어떻습니까? 예 : '''services.manual.email''' 수동 전자 메일이나 fb 전자 메일 만 존재할 수 있다고 가정하면 둘 중 어느 것이 든 둘 중 하나를 기반으로 반환하도록 논리를 프로그래밍 할 수 있습니다. 나는 이것이 클라이언트 코드에서 표준화 될 수 있고 클라이언트가받은 객체의 구조에 대해 걱정할 필요가 없도록 클라이언트에 표준 객체로 되돌려 보낼 수 있다고 생각한다. – blueren

+0

게시 기능에서 정상화 할 수 있습니까? 클라이언트 구성 요소 (예 : 내 계정 페이지)에서 정상화하면 DRY 보안 주체를 위반하는 다른 페이지에서도 동일한 작업을 수행해야 할 수 있습니다. – Evans

+1

네, ['''Accounts.onCreateUser()'''(http://docs.meteor.com/api/accounts-multi.html#AccountsServer-onCreateUser)를 사용할 수있을 것 같습니다. 새로운 사용자가 생성되면 (수동 또는 fb를 거치지 않고) 해당 전자 메일을 가져 와서'''emails'' 배열을 채 웁니다. 그렇게하면 발행물이나 클라이언트 측 렌더링을 만질 필요가 없습니다. – blueren

답변

1

한 가지 방법은 사용자가 문서를 반환해야 Accounts.onCreated()

기능을 사용하는 것이다 (하나 전달 된 하나 또는 새롭게 생성 된 객체) 변형이 요구된다 뭐든. 반환 된 문서는 Meteor.users 콜렉션에 직접 삽입됩니다.

Accounts.onCreateUser(function (options, user) { 
    // if the account is created using the manual approach, 
    // simply return the user object that will be inserted into 
    // the Users collection. 
    if (!user.services.facebook) { 
     return user; 
    } 

    // if user is created using fb's API, 
    // manually set the emails array, then return the user object 
    // which will be inserted into the Users collection. 
    user.username = user.services.facebook.name; 
    user.emails = [{address: user.services.facebook.email}]; 

    return user; 
}); 

는 위의 emails 배열은 항상 로그인 방법은 사용자가 사용하도록 선택 중 이메일을 포함 보장합니다.