Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.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
Node.js NodeJs&;Firebase嵌套forEach异步等待_Node.js_Firebase_Asynchronous_Firebase Realtime Database_Async Await - Fatal编程技术网

Node.js NodeJs&;Firebase嵌套forEach异步等待

Node.js NodeJs&;Firebase嵌套forEach异步等待,node.js,firebase,asynchronous,firebase-realtime-database,async-await,Node.js,Firebase,Asynchronous,Firebase Realtime Database,Async Await,我已经开始学习NodeJS与Firebase一起使用它来创建函数 我目前陷入困境,因为我有嵌套的forEach,它必须是异步的 我会尽量让人理解 我有3个节点: 终端 预订 TerminalBookings(类似于联接表) 我必须创建一个函数来获取所有与预订相关联的终端 所以我必须得到所有终端,对于每个终端,我可以得到所有相关的终端预订(节点键是终端id,所有值都是预订id)。 然后,当我拥有所有的终端预订时,我可以在“预订”节点中获取预订信息 使用Sql看起来很容易,但我可以找到如何使用

我已经开始学习NodeJS与Firebase一起使用它来创建函数

我目前陷入困境,因为我有嵌套的forEach,它必须是异步的

我会尽量让人理解

我有3个节点:

  • 终端
  • 预订
  • TerminalBookings(类似于联接表)
我必须创建一个函数来获取所有与预订相关联的终端

所以我必须得到所有终端,对于每个终端,我可以得到所有相关的终端预订(节点键是终端id,所有值都是预订id)。

然后,当我拥有所有的终端预订时,我可以在“预订”节点中获取预订信息

使用Sql看起来很容易,但我可以找到如何使用NodeJS

以下是我所拥有的(在这种状态下,工作是不可能的,但看起来像是我想要做的):

异步函数getReservationsSnapshotByTerminalId(terminalId){ const terminalReservationsSnap=await admin.database().ref(`/terminalBookings/${terminalId}`)。once('value'); const terminalReservations=Object.keys(terminalReservationsSnap.val()); const reservationsSnapshot=terminalReservations.map((reservationId)=>{ 返回admin.database().ref(`/bookings/${reservationId}`)。一次('value'); }); 返回承诺。全部(预订快照); } exports.showtternalswithreservations=functions.https.onRequest(异步(请求、响应)=>{ 让终端=[]; 试一试{ const terminalsSnapshot=wait admin.database().ref('/terminals/')。once('value'); terminalSnapshot.forEach(terminalSnapshot=>{ const terminal=new Borne(terminalSnapshot.key,terminalSnapshot.val()); const bookingsSnapshot=wait getReservationsSnapshotByTerminalId(terminal.key); bookingsSnapshot.forEach(预订=>{ terminal.bookings.push(booking.val()); }); 终端。推(终端); }); }捕获(错误){ } }); 但由于这条线,它无法工作:

const bookingsSnapshot = await getReservationsSnapshotByTerminalId(terminal.key);
如果我想使用wait,父forEach必须是异步的,但这是不可能的

我认为我没有正确的方式来处理这个功能,但是我被卡住了,我不知道怎么做


如果我错了,请随意完全重建此函数。

您可以通过以下两种方法之一实现此功能

for await (let terminal of terminals){
   await getReservationsSnapshotByTerminalId(terminal.terminalId);
   console.log(terminalId);
}
console.log("Done");
输出:

Terminal1
Terminal2
Terminal3
Done

同样,输出为:

Terminal1
Terminal2
Terminal3
Done
这个怎么样

const getReservationsSnapshotByTerminalId = (terminalId) => {
     return admin.database().ref(`/terminalBookings/${terminalId}`).once('value')
       .then(snapshot => {
          const terminalReservations = Object.keys(terminalReservationsSnap.val());
          const reservationsSnapshot = terminalReservations.map(reservationId => {
               return admin.database().ref(`/bookings/${reservationId}`).once('value');
       });
       return Promise.all(reservationsSnapshot);
     });
};

exports.showTerminalsWithReservations = functions.https.onRequest(async (request, response) => {
     let terminals = [];
     try {
        terminals = await admin.database().ref('/terminals/').once('value')
           .then(snapshot =>{
               const promises = [];
               const allTerminals = snapshot.val();
               const terminalKeys = Object.keys(allTerminals);
               const terminalsArray = terminalKeys.map(key => new Borne(key, allTerminals[key]));
               promises.push(terminalsArray);
               promises = promises.concat(terminalKeys.map(key => getReservationsSnapshotByTerminalId(key)));
               return Promises.all(promises);
           })
          .then(resultArray => {
               const terminalsArray = resultArray[0];
               terminalsArray.forEach((terminal, idx) => {
                  const bookingsSnapshot = resultArray[idx + 1];
                  bookingsSnapshot.forEach(booking => {
                      terminal.bookings.push(booking.val());
                  });
               });
               return terminalsArray;
         });


} catch(error) {

 }
});
const getReservationsSnapshotByTerminalId = (terminalId) => {
     return admin.database().ref(`/terminalBookings/${terminalId}`).once('value')
       .then(snapshot => {
          const terminalReservations = Object.keys(terminalReservationsSnap.val());
          const reservationsSnapshot = terminalReservations.map(reservationId => {
               return admin.database().ref(`/bookings/${reservationId}`).once('value');
       });
       return Promise.all(reservationsSnapshot);
     });
};

exports.showTerminalsWithReservations = functions.https.onRequest(async (request, response) => {
     let terminals = [];
     try {
        terminals = await admin.database().ref('/terminals/').once('value')
           .then(snapshot =>{
               const promises = [];
               const allTerminals = snapshot.val();
               const terminalKeys = Object.keys(allTerminals);
               const terminalsArray = terminalKeys.map(key => new Borne(key, allTerminals[key]));
               promises.push(terminalsArray);
               promises = promises.concat(terminalKeys.map(key => getReservationsSnapshotByTerminalId(key)));
               return Promises.all(promises);
           })
          .then(resultArray => {
               const terminalsArray = resultArray[0];
               terminalsArray.forEach((terminal, idx) => {
                  const bookingsSnapshot = resultArray[idx + 1];
                  bookingsSnapshot.forEach(booking => {
                      terminal.bookings.push(booking.val());
                  });
               });
               return terminalsArray;
         });


} catch(error) {

 }
});