Javascript 如何使用密钥检索firebase中的子数据?

Javascript 如何使用密钥检索firebase中的子数据?,javascript,node.js,firebase,firebase-realtime-database,Javascript,Node.js,Firebase,Firebase Realtime Database,我是firebase的新手。 我想获取子数据和密钥。 以下代码是我在nodejs环境中尝试过的 var firebase = require("firebase"); firebase.initializeApp({ databaseURL: "https://some.firebaseio.com/" }); var customer = firebase.database().ref().child('customer'); cons

我是firebase的新手。 我想获取子数据和密钥。 以下代码是我在nodejs环境中尝试过的

  var firebase = require("firebase");

    firebase.initializeApp({
       databaseURL: "https://some.firebaseio.com/"
    });


    var customer = firebase.database().ref().child('customer');

    const fname = "name";
    const lname = "title";
    customer.orderByChild("partnerFirstName").equalTo(fname).on('child_added', function (snapshot) {
       console.log(snapshot.val());

       var fn = snapshot.val().partnerFirstName;

       var custdata = snapshot.val();

       console.log(custdata);
       console.log("FirstName:"+fn);

       if (custdata.partnerFirstName === fn) {
         console.log(custdata);

       }


     });
结果如下

    {
      createdAt: '2018-03-20T23:25:35.212Z',
      partnerEmail: 'beard@yahoo.com',
      partnerFirstName: 'name',
      partnerGender: 'male',
      partnerLastName: 'title',
      partnerPhone: '444-602-4444',
      profilePicture: 'assets/profile_icon.png',
      uid: 'x99wl8kkmJSENpNdVMXTXCh7amy2' }
      FirstName: name
{ '-L84iSPyr9bPvnJZ6BgV':
   { 
     createdAt: '2018-03-20T23:25:35.212Z',
     partnerEmail: 'beard@yahoo.com',
     partnerFirstName: 'name',
     partnerGender: 'male',
     partnerLastName: 'title',
     partnerPhone: '444-602-4444',
     profilePicture: 'assets/profile_icon.png',
     uid: 'x99wl8kkmJSENpNdVMXTXCh7amy2' } }
     FirstName: undefined
在这种情况下,我们没有得到记录的键值,但是firstname没有任何错误

但是当我们尝试下面的代码时,密钥随数据一起出现,但是firstname是未定义的

 var customer = firebase.database().ref().child('customer');

        const fname = "Name";
        const lname = "Title";
        customer.orderByChild("partnerFirstName").equalTo(fname).on('value', function (snapshot) {
           console.log(snapshot.val());

           var fn = snapshot.val().partnerFirstName;

           var custdata = snapshot.val();

           console.log(custdata);
           console.log("FirstName:"+fn);
           if (custdata.partnerFirstName === fn) {
             console.log(custdata);

           }


         });
结果如下

    {
      createdAt: '2018-03-20T23:25:35.212Z',
      partnerEmail: 'beard@yahoo.com',
      partnerFirstName: 'name',
      partnerGender: 'male',
      partnerLastName: 'title',
      partnerPhone: '444-602-4444',
      profilePicture: 'assets/profile_icon.png',
      uid: 'x99wl8kkmJSENpNdVMXTXCh7amy2' }
      FirstName: name
{ '-L84iSPyr9bPvnJZ6BgV':
   { 
     createdAt: '2018-03-20T23:25:35.212Z',
     partnerEmail: 'beard@yahoo.com',
     partnerFirstName: 'name',
     partnerGender: 'male',
     partnerLastName: 'title',
     partnerPhone: '444-602-4444',
     profilePicture: 'assets/profile_icon.png',
     uid: 'x99wl8kkmJSENpNdVMXTXCh7amy2' } }
     FirstName: undefined

如何获取子数据和密钥?要获取密钥,请尝试以下操作:

var ref = firebase.database().ref("customer").orderByChild("partnerFirstName").equalTo(fname);
ref.once("value").then(function(snapshot) {
snapshot.forEach(function(child){
var key = child.key; 
var partnerName=child.val().partnerFirstName;

  });
});

在上面,您在
customer
的子项中迭代,然后使用
var key=child.key检索密钥

您应该将代码替换为

customer.orderByChild("partnerFirstName").equalTo(fname).on('value', 
    function (snapshot) {

       var snap = snapshot.val();
       var key = Object.keys(snap);
       var custdata = snap[key];
       var fn = snap[key].partnerFirstName;

       if (custdata.partnerFirstName === fn) {
         console.log(custdata);
       }
 });

返回密钥和子项

感谢大家。我成功地解决了这段代码的问题。我的主要动机是使用上述代码通过firebase cloud函数获取json格式。它工作正常。我成功地在url中搜索了firstname和lastname,并获取了相应的记录

exports.getCustomerbyname2 = functions.https.onRequest((req, res) => {
    res.header('Content-Type', 'application/json');
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Headers', 'Content-Type');


    if (req.method === 'OPTIONS') {
      res.status(204).send('');
    }
    const fname = req.query.fname;
    const lname = req.query.lname;

    var customer=admin.database().ref().child('customer'); 
    customer.on('child_added', function (snapshot) {
        var fname1 = snapshot.val().partnerFirstName; 
        var lname1 = snapshot.val().partnerLastName; 

       customer.orderByChild('partnerFirstName').equalTo(fname).once('value', function(snapshot) {


            var arr=[];
            if (fname1 === fname && lname1===lname) {
                arr.push(snapshot.val());
                console.log(snapshot.val());
                res.status(200).json({ customer: arr});


            }else{
                res.status(200).send('ERROR : ' + errorObject);

            }

        },function(errorObject){
            console.log("The read failed: " + errorObject.code);
           // res.status(200).send('ERROR : ' + errorObject);
        });

    });

});

它不会以完美的格式出现,因为我们必须以angular作为服务进行迭代,请参见第二个输出,我们需要json(键和值)格式的数据,但“FirstName”返回未定义。我们已经尝试了您的上述代码。请参见我们的第一个代码,在这种情况下,我们无法检索键。但我们可以检索值,但在第二种代码情况下,我们可以检索键和值,但无法检索名字。您如何无法检索答案中的键,当您迭代时,您将能够获得该pushid。然后,要获得
partnerFirstName
,只需按照答案中的操作,即可访问子级。如果您想要
FirstName
,根据您的问题,它似乎是
customer
下的直接子项,并且是pushid的兄弟,那么do
var name=snapshot.val().FirstName获取它。