Javascript firebase函数+;实时数据库-数据库结构和代码
我正在使用一个简单的应用程序: 这是我第一次尝试firebase函数+实时数据库 这些函数将由外部客户端应用程序(如android)调用 如果不是javascript+nosqldb,我就不会有问题,但在这里我被卡住了,因为我不确定最佳的数据库结构和类似事务的操作 I.存储的数据:Javascript firebase函数+;实时数据库-数据库结构和代码,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,我正在使用一个简单的应用程序: 这是我第一次尝试firebase函数+实时数据库 这些函数将由外部客户端应用程序(如android)调用 如果不是javascript+nosqldb,我就不会有问题,但在这里我被卡住了,因为我不确定最佳的数据库结构和类似事务的操作 I.存储的数据: 用户配置文件(id、全名、电子邮件、电话、照片) 每个用户的票数 购票历史 门票使用历史 二,操作: 用户购买一些票据-应将票据添加到用户的金额中,并将记录添加到购买历史记录中 用户使用一些票据-应从用户的金额
- 用户配置文件(id、全名、电子邮件、电话、照片)
- 每个用户的票数
- 购票历史
- 门票使用历史
- 用户购买一些票据-应将票据添加到用户的金额中,并将记录添加到购买历史记录中
- 用户使用一些票据-应从用户的金额中删除票据,并将记录添加到使用历史记录中
exports.addTickets = functions.https.onCall((data, context) => {
// data comes from client app
const buyingRecord = data;
console.log(‘buyingRecord: ‘ + JSON.stringify(buyingRecord));
return tickets.updateTicketsAmmount(buyingRecord)
.then((result)=>{
tickets.addTicketsBuyingRecord(buyingRecord);
result.userid = buyingRecord.userid;
result.ticketsCount = buyingRecord.ticketsCount;
return result;
});
});
exports.updateTicketsAmmount = function(buyingRecord) {
var userRef = db.ref(‘users/’ + buyingRecord.userid);
var amountRef = db.ref(‘users/’ + buyingRecord.userid + ‘/ticketsAmount’);
return amountRef.transaction((current)=>{
return (current || 0) + buyingRecord.ticketsCount;
})
.then(()=>{
console.log(“amount updated for userid [“ + buyingRecord.userid + “]”);
return userRef.once(‘value’);
})
.then((snapshot)=>{
var data = snapshot.val();
console.log(“data for userid [“ + snapshot.key + “]:” + JSON.stringify(data));
return data;
});
}
exports.addTicketsBuyingRecord = function(buyingRecord) {
var historyRef = db.ref(‘ticketsBuyingHistory’);
var newRecordRef = historyRef.push();
return newRecordRef.set(buyingRecord)
.then(()=>{
console.log(‘history record added.’);
return newRecordRef.once(‘value’);
})
.then((snapshot)=>{
var data = snapshot.val();
console.log(‘data:’ + JSON.stringify(data));
return data;
});
}
=======tickets.js=======
exports.addTickets = functions.https.onCall((data, context) => {
// data comes from client app
const buyingRecord = data;
console.log(‘buyingRecord: ‘ + JSON.stringify(buyingRecord));
return tickets.updateTicketsAmmount(buyingRecord)
.then((result)=>{
tickets.addTicketsBuyingRecord(buyingRecord);
result.userid = buyingRecord.userid;
result.ticketsCount = buyingRecord.ticketsCount;
return result;
});
});
exports.updateTicketsAmmount = function(buyingRecord) {
var userRef = db.ref(‘users/’ + buyingRecord.userid);
var amountRef = db.ref(‘users/’ + buyingRecord.userid + ‘/ticketsAmount’);
return amountRef.transaction((current)=>{
return (current || 0) + buyingRecord.ticketsCount;
})
.then(()=>{
console.log(“amount updated for userid [“ + buyingRecord.userid + “]”);
return userRef.once(‘value’);
})
.then((snapshot)=>{
var data = snapshot.val();
console.log(“data for userid [“ + snapshot.key + “]:” + JSON.stringify(data));
return data;
});
}
exports.addTicketsBuyingRecord = function(buyingRecord) {
var historyRef = db.ref(‘ticketsBuyingHistory’);
var newRecordRef = historyRef.push();
return newRecordRef.set(buyingRecord)
.then(()=>{
console.log(‘history record added.’);
return newRecordRef.once(‘value’);
})
.then((snapshot)=>{
var data = snapshot.val();
console.log(‘data:’ + JSON.stringify(data));
return data;
});
}
你必须使用回调,Android上添加或读取数据的请求有一个onSuccess或OnFailure回调,我用这个来触发我的新请求 你可以在单据上查到:)
另外,如果您使用Firestore而不是使用实时数据库,您可以使用Firestore事务,这里是。我已经用数据库结构和js代码更新了我的问题。我正在尝试使用Promissions,但目前还没有成功。嘿,好吧,如果你有日志,你介意分享一下吗?或者解释一下函数在做什么,你到底在哪里卡住了,谢谢你的延迟。我已经更新了问题中的源代码。我想现在好多了。1.使用此级别2上的事务更新票证金额。添加购买记录。但我仍然确信,如果第一步成功,第二步失败会怎样。数据可能不一致:更新的计数没有相应的记录。我不确定在nosql db中使用如此低级别的事务是否是一个好主意。对不起,我在上一条评论中的意思是“仍然我不确定”,但我不能再编辑它了。