EXPO和Firebase实时数据库-在写入数据库之前读取值并确认不存在特定值

原学程将引见EXPO以及Firebase及时数据库-在写进数据库之前读与值并确认没有存留特定值的处置办法,这篇学程是从其余处所瞅到的,而后减了1些海外法式员的疑问与解问,愿望能对于您有所赞助,佳了,上面开端进修吧。

EXPO和Firebase实时数据库-在写入数据库之前读取值并确认不存在特定值 教程 第1张

成绩描写

我有1个功效正常的Reaction Native EXPO运用法式,它与我的Firebase及时数据库接互。简而言之,我在试图找到1种办法去检讨一切子值以检查能否存留某个值,而后将该值(再次)作为新记载写进数据库,这让我觉得迷惑。

我曩昔一向从我的App.js中的世专会推送告诉API夺取&Quot;ExponentPushToken&Quot;,而后在从世专会推送告诉API注册推送告诉的雷同函数中应用以下代码立刻向我的Firebase及时数据库写进新记载:

const token = (await Notifications.getExpoPushTokenAsync()).data;
console.log(token);
var userListRef = firebase.database().ref("users/push_token");
var newUserRef = userListRef.push();
newUserRef.set(token);

我借有以下代码读与数据库并将准确的信息记载到掌握台,以就可以或许将一切输入值与后面提到的"内标记&Quot;值停止比拟:

var userListRef = firebase.database().ref("users/push_token");
  userListRef.on("value", function (snapshot) {
 snapshot.forEach(function (child) {
console.log(child.val());
 });
  });

在I[二-0]以及.set()在我的Firebase及时数据库中创立新记载之前,我试图夺取"令牌并确认它没有是我的Firebase Realtime数据库中的&quot.val()"(跨数据库的现有值)。我也愿望可以或许登录掌握台停止验证。上面的代码没有起感化...我在这里的测验考试是测验考试.push()到1个数组,并检查"标志&能否在数组中的某个地位。这类情形正在产生,但是我应用"if/Else"语句的最初1个函数仍在为数据库中的每一笔记录轮回。没有肯定怎样在没有为数据库中的每一笔记录轮回后续函数的情形下编辑此代码。

const token = (await Notifications.getExpoPushTokenAsync()).data;
console.log(token);
var userListRef = firebase.database().ref("users/push_token");
userListRef.once("value", function (snapshot) {
  snapshot.forEach(function (child) {
 createPushTokenArray(child.val());
 myTokenHandler(token);
  });
});

  var allPushTokens = [];
  async function createPushTokenArray(dbState) {
 allPushTokens.push(dbState);
 return;
  }

  async function myTokenHandler(myToken) {
 await createPushTokenArray();
 var checkForValue = allPushTokens.includes(myToken);
 if (checkForValue === true) {
return console.log("Push Token already stored in database.");
 } else {
var userListRef = firebase.database().ref("users/push_token");
var newUserRef = userListRef.push();
var writeNewToken = newUserRef.set(myToken);
writeNewToken;
return console.log("New Push Token stored in database.");
 }
  }

我屡次测验考试在这1切中获得所有停顿,但是皆是白费的。作为参照,上面是db构造(JSON格局):

{
  "users" : {
 "push_token" : {
"key or name" : "value",
"-Maer一EuNpR二四LdhxmIl" : "ExponentPushToken[xxxxxxxxxxxxxxxxxxxxxx]",
 }
  }
}

推举谜底

现实上我本身便能搞清晰,对于所有感兴致的人去说。这能够没有是最清洁的办法,但是成果正佳发生了我须要的器械。

而没有是运转弗成停滞的forEach()轮回,我只是夺取全部数据库,而后界说它,并只提与值。

请参阅上面的代码,它不妨有用天检讨数据库中的一切值能否皆包括我们的特定值。

const token = (await Notifications.getExpoPushTokenAsync()).data;
console.log(token);
//---The above sits inside of a function. It is Expo's code for expo-notifications api----///
var userListRef = firebase.database().ref("users/push_token");
userListRef.once("value", function (snapshot) {
  createPushTokenArray(snapshot.val());
  myTokenHandler(token);
});
//---More code here to close function(s) and complete expo-notificaions api integration for Push Notifications---///
  var allPushTokens = [];
  function createPushTokenArray(dbState) {
 const defineDb = new Object(dbState);
 const newState = Object.values(defineDb);
 allPushTokens.push(newState);
  }
  async function myTokenHandler(myToken) {
 await createPushTokenArray();
 const cleanSearch = allPushTokens.values();
 for (const allData of cleanSearch) {
console.log(allData);
var checkForValue = allData.includes(myToken);
if (checkForValue == true) {
  console.log("Push Token already stored in database.");
  break;
} else {
  var userListRef = firebase.database().ref("users/push_token");
  var newUserRef = userListRef.push();
  var writeNewToken = newUserRef.set(myToken);
  writeNewToken;
  console.log("New Push Token stored in database.");
  break;
}
 }
  }

其任务道理以下:

    夺取全部Firebase及时数据库的快照并为盘问输入以及我的装备的令牌创立回调:

var userListRef = firebase.database().ref("users/push_token");
userListRef.once("value", function (snapshot) {
  createPushTokenArray(snapshot.val());
  myTokenHandler(token);
});

    CREATE Function将下面的输入界说为1个对于象,而后只夺取值(增除键)并创立1个齐局变质(AllPushTokens),该变质将创立1个仅包括对于象值的新数组。这里的输入依然有面治,所以我们将退1步细分,使其在第3步中有效。

  var allPushTokens = [];
  function createPushTokenArray(dbState) {
 const defineDb = new Object(dbState);
 const newState = Object.values(defineDb);
 allPushTokens.push(newState);
  }

    最初,创立1个异步函数,该函数回调我的装备的"标志&q;,期待上1个函数为我们创立1个新界说的数组,而后应用allPushTokens.values();剖析新界说的数组以仅包含数组值,这为我们供给了与我的Devie&q;标志&q;比拟较的可读性以及有效的输入。而后,我们应用for-of开端轮回遍历数据,直到知足我们的前提:(假如)我的装备的"内标记"包括在我的数据库中的某个值中,则停滞轮回,(不然/而后)持续将我的装备的&q;内标记&q;写进数据库。

  async function myTokenHandler(myToken) {
 await createPushTokenArray();
 const cleanSearch = allPushTokens.values();
 for (const allData of cleanSearch) {
console.log(allData);
var checkForValue = allData.includes(myToken);
if (checkForValue == true) {
  console.log("Push Token already stored in database.");
  break;
} else {
  var userListRef = firebase.database().ref("users/push_token");
  var newUserRef = userListRef.push();
  var writeNewToken = newUserRef.set(myToken);
  writeNewToken;
  console.log("New Push Token stored in database.");
  break;
}
 }
  }

佳了闭于EXPO以及Firebase及时数据库-在写进数据库之前读与值并确认没有存留特定值的学程便到这里便停止了,愿望趣模板源码网找到的这篇技巧文章能赞助到年夜野,更多技巧学程不妨在站内搜刮。