Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firebase交易预订系统_Javascript_Firebase_Google Cloud Firestore - Fatal编程技术网

Javascript 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

我正在使用firebase建立预订系统。用户可以选择多个座位,我想把它们写在我的文档中。选定的座位位于一个数组中,它们是对象,如下所示:

    {
      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的新文档。