0

Firebase docs に示されている例のように、ユーザー名が使用されているかどうかを確認しようとしています:


function go() {
  var userId = prompt('Username?', 'Guest');
  checkIfUserExists(userId);
}

var USERS_LOCATION = 'https://SampleChat.firebaseIO-demo.com/users';

function userExistsCallback(userId, exists) {
  if (exists) {
    alert('user ' + userId + ' exists!');
  } else {
    alert('user ' + userId + ' does not exist!');
  }
}

// Tests to see if /users/<userId> has any data. 
function checkIfUserExists(userId) {
  var usersRef = new Firebase(USERS_LOCATION);
  usersRef.child(userId).once('value', function(snapshot) {
    var exists = (snapshot.val() !== null);
    userExistsCallback(userId, exists);
  });
}

しかし、私が参照しているデータは、参照に問題があるデータのレイヤーにあります。

firebaseio.com/{userID}/primary/{username}

151 (ユーザー ID) | |> プライマリ | |> ユーザー名: ユーザー名

userID の子の下にあるプライマリ ツリーの下のユーザー名フィールドを確認したいのですが、何か提案はありますか?

4

1 に答える 1

1

あなたのデータ構造が何であるかは少し不明です。上記の私のコメントを参照してください。データについていくつかの仮定を立てます。次のようになります。

{151}/primary/username/{kato}

中括弧内の部分が可変ビットで、残りが固定キーである場合、パスを次のように変更するだけです。

// in checkIfUserExists
usersRef.child(userId).child('primary/username').on('value', ...)

ユーザーIDがない場合は、すべてのユーザーを繰り返して名前を確認できます。

usersRef.once('value', function(ss) {
    ss.forEach(function(childSnapshot) {
       var userID = childSnapshot.name();
       childSnapshot.ref().child('primary/username').once('value', function(ss) {
           var userName = ss.val();
           /* do something with name and ID here */
       });
    });
});

別の方法として、ユーザー リストがばかばかしいほど巨大 (数千) になると思われる場合は、別のパスでユーザー名を ID にインデックス付けし、反復を回避することをお勧めします。

userList/{username}/{userID}

次のように使用できます。

 userListRef.child(username).once('value', function(ss) {
    var userID = ss.val();
    if( userID !== null ) {
        /* user exists and we have the name and id now */
    }
 });
于 2013-02-16T15:30:54.217 に答える