node.js - 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);
}
解决方案
要将数据写入值基于现有值的数据库,您需要使用 Firebase 实时数据库事务。有关这方面的更多信息和示例,请参阅Firebase 文档中的以事务方式保存数据。
推荐阅读
- graphql - 如何使用反应测试库模拟删除测试中的项目?
- java - 使对象的字段对于存储在数组列表中的每个对象都是唯一的
- microsoft-graph-api - MS Teams 个人选项卡不支持经典 SharePoint 页面?
- ruby - 为什么`which -a ruby`显示错误的路径?
- angular - 角度动态分配模板
- javascript - 开玩笑:toHaveBeenCalled 返回 0 而不是 1
- intellij-plugin - 如何从 github 存储库安装用于 intellij 的 Kotest 插件?
- java - NullPointerException 尽管检查对象不为空?
- python - 解包并重新加入固定宽度的文本
- c# - 限制 SkiaSharp 中 SKCanvasView 的平移