Firebase云功能实时数据库并行请求

时间:2018-11-19 09:33:41

标签: node.js firebase firebase-realtime-database google-cloud-functions

使用云功能处理并行请求时遇到问题。 我的情况是从数据库中选择一个驱动程序并更新其状态。
我确实在更新状态属性之前对其进行了检查,但是当我在一秒钟内发送多个请求(特定于创建触发器的数据库)时,它似乎没有读取更新的状态属性。
并且它总是使用上一个请求的信息进行更新。
我还注意到有时有时会完全处理请求。
我该怎么做才能解决这些问题?


index.js

const db = app.database();
const TripManagementUtil = require('./utils').TripManagementUtil;

exports.triggerNotifications = functions.database.ref('/Trip/{pushId}').onCreate( (snapshot, context)  => 
{
    var newTrip = snapshot.val();
    var tripKey = context.params.pushId;
    var tripManagementUtil = new TripManagementUtil();
    tripManagementUtil.searchDrivers(tripKey, newTrip, db);    
});


utils.js

searchDrivers(tripKey, trip, db){

    const results = [];
    var lat = trip.pickupLocation.lat, long = trip.pickupLocation.lng;
    var vehicleTypeID = trip.vehicleTypeID;
    var alreadyAssigned = trip.alreadyAssigned;
    var self = this;

    if(alreadyAssigned == null || alreadyAssigned == 'undefined'){
        alreadyAssigned = [];
    }

    const geofireQuery = new GeoFire(db.ref('vehicleLocation').child(vehicleTypeID + "")).query({
        center: [lat, long],
        radius: constants.searchRadius
    })
    .on('key_entered', (key, coords, distance) => {
        if(alreadyAssigned.indexOf(key) == -1){
            var result = {
                driverID: key,
                distance: distance
            }
            results.push(result);
        }  
    });
    setTimeout(() => {

        geofireQuery.cancel(); 

        if (results.length === 0) {
            self.noDriversHandler(alreadyAssigned, tripKey, db);
        } else {
            results.sort((a, b) => a.distance - b.distance);
            var driversAvailable = false;
            var index = 0;
            function checkDriver(){
                db.ref().child("driver").child("available").child(results[index].driverID).once('value').then(function(vehicleSnap){
                    var vehicle = vehicleSnap.val();
                    if(!driversAvailable){
                        if(vehicle != null && vehicle.vehicleTypeID == vehicleTypeID
                            && (vehicle.tripStatus != TripVehicleActionEnum.DriverConfirmed && vehicle.tripStatus != TripVehicleActionEnum.VehicleAssigned)
                            && alreadyAssigned.indexOf(vehicle.driverID +"") === -1){
                            driversAvailable = true;
                            self.driverExistsHandler(trip, tripKey, alreadyAssigned, vehicle, db);  
                        }
                        if(!driversAvailable && index + 1 == results.length){
                            self.noDriversHandler(alreadyAssigned, tripKey, db);
                        }  
                        index++;  
                    }
                    else{
                        index++;
                        checkDriver();
                    }
                });
            }
            checkDriver();
        }    
    }, 1500);
}

1 个答案:

答案 0 :(得分:1)

要将数据写到该值基于现有值的数据库中,您将需要使用Firebase Realtime Database事务。有关此内容和示例的更多信息,请参阅Firebase文档中的save data transactionally