首页 > 解决方案 > Firebase 云功能实时数据库并行请求

问题描述

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


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);    
});


实用程序.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);
}

标签: node.jsfirebasefirebase-realtime-databasegoogle-cloud-functions

解决方案


要将数据写入值基于现有值的数据库,您需要使用 Firebase 实时数据库事务。有关这方面的更多信息和示例,请参阅Firebase 文档中的以事务方式保存数据。


推荐阅读