Javascript firebase函数+;实时数据库-数据库结构和代码

Javascript firebase函数+;实时数据库-数据库结构和代码,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,我正在使用一个简单的应用程序: 这是我第一次尝试firebase函数+实时数据库 这些函数将由外部客户端应用程序(如android)调用 如果不是javascript+nosqldb,我就不会有问题,但在这里我被卡住了,因为我不确定最佳的数据库结构和类似事务的操作 I.存储的数据: 用户配置文件(id、全名、电子邮件、电话、照片) 每个用户的票数 购票历史 门票使用历史 二,操作: 用户购买一些票据-应将票据添加到用户的金额中,并将记录添加到购买历史记录中 用户使用一些票据-应从用户的金额

我正在使用一个简单的应用程序: 这是我第一次尝试firebase函数+实时数据库

这些函数将由外部客户端应用程序(如android)调用

如果不是javascript+nosqldb,我就不会有问题,但在这里我被卡住了,因为我不确定最佳的数据库结构和类似事务的操作

I.存储的数据:

  • 用户配置文件(id、全名、电子邮件、电话、照片)
  • 每个用户的票数
  • 购票历史
  • 门票使用历史
二,操作:

  • 用户购买一些票据-应将票据添加到用户的金额中,并将记录添加到购买历史记录中

  • 用户使用一些票据-应从用户的金额中删除票据,并将记录添加到使用历史记录中

所以我的基本问题是这个ANDs——如果它是一个SQL db,我会使用一个事务,但在这里我不确定db结构和js代码是什么,以实现相同的结果

编辑: ==========index.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;
 });
}
=======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中使用如此低级别的事务是否是一个好主意。对不起,我在上一条评论中的意思是“仍然我不确定”,但我不能再编辑它了。