我正在使用一个实时数据库来处理一些数据在Firebase web应用程序中。在下面的代码中,只有当fieldOne和fieldTwo不被复制时,我才希望在DB中插入一条记录。
dbReference.orderByChild("fieldOne").equalTo(fieldOneVal).once('value')
.then(function(snapshot) {
if (snapshot.exists()) {
alert('This fieldOne has already been used.')
reject();
}
}).then( // What is the correct way to connect this line and the following ??
dbReference.orderByChild("fieldTwo").equalTo(fieldTwoVal).once('value')
.then(function(snapshot) {
if (snapshot.exists()) {
alert('This NAME has already been used.')
reject();
}
// All is now OK.
.... do the final things here .....
}).catch(function(error) {
// An error happened.
alert('This record cannot be inserted.')
});在这一点上,我能够调整代码,使事情按照我所希望的方式工作。但我的问题是,我没有按照正确的方式做事(我知道,由于一些信息,我可以在控制台上看到)。代码中的注释显示了我需要知道连接这两个部分的正确方法。什么是..。下面这个?
有关信息,DB如下所示:
MyList
+ -M93j....443cxYYDSN
fieldOne: "asdc..."
fieldTwo: "Gkk...."
+ -M94j.........OZS6FL
fieldOne: "afc..."
fieldTwo: "SDFSk...."发布于 2020-05-31 13:05:01
下面的承诺链接与错误抛出相结合,应该可以做到这一点。
dbReference
.orderByChild('fieldOne')
.equalTo(fieldOneVal)
.once('value')
.then(function (snapshot) {
if (snapshot.exists()) {
throw new Error('fieldOneExists');
}
return dbReference
.orderByChild('fieldTwo')
.equalTo(fieldTwoVal)
.once('value');
})
.then(function (snapshot) {
if (snapshot.exists()) {
throw new Error('fieldTwoExists');
}
// All is now OK.
//.... do the final things here .....
})
.catch(function (error) {
if (
error.message === 'fieldOneExists' ||
error.message === 'fieldTwoExists'
) {
console.log('This record cannot be inserted');
} else {
console.log('other error');
}
});但是,最好使用事务来检查fieldOne和fieldTwo字段的两个值是否存在。
问题是实时数据库事务不能处理查询:您需要准确地知道要修改的数据的位置(或者检查是否存在/不存在)。因此,如果您确实需要一个事务(这取决于您的确切的全局需求),则需要调整您的数据模型。
例如,您可以创建数据库节点,并将fieldOne和fieldTwo值的值连接起来,并检查事务中是否存在这样的节点。但是,同样,这种方法的可行性取决于您的确切全局需求,而我们不知道这一点。
发布于 2020-05-31 12:01:47
尝试hasChild()方法。
if(snapshot.hasChild('name') {
// ... do stuff !
}或,
在您的firebase实时数据库中创建一个名为用户名的新节点,并在此列表中添加每个用户名。在插入新用户名之前,请检查它是否存在于此列表中
https://stackoverflow.com/questions/62114960
复制相似问题