如何从数据库中读取密钥

时间:2020-04-28 09:37:04

标签: javascript firebase firebase-realtime-database

当我检索Firebase实时数据库快照时,其值(snapshot.val())带有一个密钥,无法访问文档中的数据。这是代码。

const recordExist = await admin.database().ref("order").child("live_orders").orderByChild('driver_id').equalTo(driverId)
            .limitToLast(1).once('value', function (snapshot) {
                console.log('Live order exisitng :  ' + JSON.stringify(snapshot.val()));
                return snapshot.val();
            });

这是控制台日志

Live order exisitng :  {
   "-M4E52NNntPP5BSHp0b-":{
      "customerName":"Ruwan Perera",
      "customerNo":"0775886998",
      "deliveryAddress":"Galle Rd, Moratuwa 10400",
      "deliveryLocation":{
         "latitude":6.7798672,
         "longitude":79.8831725
      },
      "distance_to_deliver":14791,
      "distance_to_pickup":788,
      "driver_id":"K9HA9HfLMEZC4qR1IDbjGbSscx13",
      "duration_to_deliver":2228,
      "duration_to_pickup":171,
      "orderNo":"order-0001",
      "order_id":"-M4E52AHF4nMwis0b6Wa",
      "paymentMethod":"Cash On Delivery",
      "pickupAddress":"603 Kotte Rd, Sri Jayawardenepura Kotte 10100",
      "pickupLocation":{
         "latitude":6.8903602,
         "longitude":79.9032734
      },
      "status":"Rejected",
      "totalPayment":"1000",
      "totalQuantity":"5",
      "total_distance":15579,
      "total_duration":342
   }
}

,我要访问其中的“状态”。当我尝试访问状态时说未定义。

2 个答案:

答案 0 :(得分:0)

您正在混淆异步/等待和回调方法,不建议这样做。

因此,对于async / await,您应该执行以下操作:

const dataSnapshot = await admin.database().ref("order").child("live_orders").orderByChild("driver_id").equalTo(driverId).limitToLast(1).once('value');
const status = dataSnapshot.val().status;

我们只需调用DataSnapshot的{​​{3}}方法,即可提取JavaScript值并获取此JavaScript对象的status属性。

如果要在异步函数中对其进行转换,可以执行以下操作(根据实际需要进行调整):

async function isRecordRejected(driverId) {

    const dataSnapshot = await admin.database().ref("order").child("live_orders").orderByChild("driver_id").equalTo(driverId).limitToLast(1).once('value');
    const status = dataSnapshot.val().status;
    return (status ===  "Rejected" ? true : false);

}

最后,请注意,如果要检查是否存在DataSnapshot,则应使用val()方法。

答案 1 :(得分:0)

我找到了解决问题的办法。

将值观察器附加到数据列表将以单个快照的形式返回整个数据列表,然后您可以循环访问它们以访问各个子项。

即使查询只有一个匹配项,快照仍然是列表;它只包含一个项目。要访问该项目,您需要遍历结果:

所以我的解决办法是

const existingRecords: any[] = [];

            const recordExist = await admin.database().ref("order").child("live_orders").orderByChild('driver_id').equalTo(driverId).limitToLast(1).once('value', function (snapshot) {
                snapshot.forEach(function (childSnapshot) {
                    var childData = childSnapshot.val();
                    console.log('child snapshot : ' + JSON.stringify(childData));
                    existingRecords.push(childData);
                });
            });

            if (recordExist !== null) {
                const status = existingRecords[0].status;
                if (status !== 'Rejected') {
                    if (status !== 'Completed') {
                        console.log('driver ' + driverLive.firstName + ' ' + driverLive.lastName + ' is busy right now and status is ' + status);
                        continue;
                    }
                }
            }

对我有用。