当我检索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
}
}
,我要访问其中的“状态”。当我尝试访问状态时说未定义。
答案 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;
}
}
}
对我有用。