Javascript Firebase交易预订系统
我正在使用firebase建立预订系统。用户可以选择多个座位,我想把它们写在我的文档中。选定的座位位于一个数组中,它们是对象,如下所示:Javascript Firebase交易预订系统,javascript,firebase,google-cloud-firestore,Javascript,Firebase,Google Cloud Firestore,我正在使用firebase建立预订系统。用户可以选择多个座位,我想把它们写在我的文档中。选定的座位位于一个数组中,它们是对象,如下所示: { reservationId: 'id', selectedSeats: [{"x": 0, "y": 0,}, {"x": 1, "y": 0,}, {"x": 2, "y": 0,}] } 我想确保没有其他用户可以使用至少1
{
reservationId: 'id',
selectedSeats: [{"x": 0, "y": 0,},
{"x": 1, "y": 0,},
{"x": 2, "y": 0,}]
}
我想确保没有其他用户可以使用至少1个相同的席位写入数据库,并进行事务处理
let transaction = db.runTransaction(t => {
return t.get(venueId)
.then(doc => {
//I need to get all the objects inside the document and check their array of reservations.
t.set(venueId, {reservation});
});
}).then(result => {
console.log('Transaction success!');
}).catch(err => {
console.log('Transaction failure:', err);
});
如果在文档中每个对象的数组中找到一个席位,如何使事务失败?您可以使用
数组包含任何
来检查db上是否已保留任何席位,并根据结果返回成功或失败的承诺,此外,您还需要在事务外部创建对空文档的引用,然后才能在其中创建文档,下面是它的外观:
//reference to a document that still does not exists
var docRef = db.collection(reservation).doc()
let transaction = db.runTransaction(t => {
return t.get(venueId)
.then(doc => {
db.collection('reservation')
.where('selectedSeats', 'array-contains-any', reservation.selectedSeats)
.get()
.then(snapshot =>{
if (snapshot.empty) {
t.set(docRef, {
uid: venueId,
reservation: reservation
});
return Promise.resolve('Reservation Complete');
}
return Promise.reject('Seats already taken');
})
});
}).then(result => {
console.log('Transaction success!');
}).catch(err => {
console.log('Transaction failure:', err);
});
注意:正如您在for
数组中看到的,该where子句将在您的预订中限制为10个值。selectedSeats
数组。此外,我不确定您是否必须使用venueId
获取空文档,因为您希望使用该ID,因此我鼓励您尝试两种方法。谢谢!我已经试过了,交易成功被打印出来了。但是,t.set不起作用,因为数据库中没有任何内容。此外,结果是未定义的。有什么想法吗?添加一个console.log('快照为空!')
在条件内检查检索到的快照是否为空,并让我知道它是否记录,您是否可以共享如何装入保留对象(即,它有哪些字段以及填充了哪些内容)?是的,快照为空,并按预期工作。当选择同一个座位时,它将转到已坐的座位。该对象与我在示例中提供的对象类似。这是我的自定义版本,它不需要您试图使用的t.set.doc().set(object)
,因为set()
需要像这样调用.doc(docId).set(object)
,如果您想在该集合上创建一个全新的文档,您需要使用add()
,而不是set()
。请尝试一下,并让我知道它是否有效。上面的代码有效,问题是使用t.set()无法工作。当我调用add()时,它会创建一个具有随机唯一id的新文档。