【问题标题】:How to wait for data to be fetched from cloud firestore and then return them in NodeJS?如何等待从 Cloud Firestore 中获取数据,然后在 NodeJS 中返回它们?
【发布时间】:2020-04-15 10:56:40
【问题描述】:

我想从 Cloud Firestore 中获取一些数据,然后在地图中返回该数据。问题是系统在获取该值之前返回该值并且承诺处于未决状态。我尝试了很多东西,但无法解决问题。如果有人可以帮助我,那就太好了!

function homepage(formData) {
    var cfire = cfirebase.firestore().collection('Details').doc('dsadsadasdsadasdsdsdasd');

    const test = cfire.get().then(doc => {
        if (doc.exists) {
            Name = doc.data().dd.dn;
            vehical = doc.data().dd.vn;
            vehicalNumber = doc.data().dd.vno;
            console.log(Name, vehical, vehicalNumber);
        } else if (!doc.exists) {
            console.log("Detail does not exist");
            return Promise.reject(new Error('Detail does not exist'));
        } else {
            throw Promise.reject(new Error('Server error!'));
        }
    }).catch(e => {
        return false
    });
    return {
        tripID: {
            c: false,

            dd: {
                // Driver name 
                dn: Name,
                // Vehical name
                vn: vehical,
                // Vehical number
                vno: vehicalNumber,
            }
        }
    };
}

【问题讨论】:

  • 您能否澄清一下,因为我无法在您的代码中看到任何地图。尝试更准确地说您想要的输出是什么,当前输出是什么。也分享一些截图。

标签: node.js google-cloud-firestore google-cloud-functions


【解决方案1】:

您的函数在从云 Firestore 获取数据之前返回对象的原因是因为 cfirebase.firestore().collection(...).doc(...) 是异步的,它返回一个 Promise,所以您必须等待 Promise 解决才能返回最终结果对象。

如果你不熟悉这个概念,你应该阅读asynchronous programming

我建议您更改您的 homepage 函数,使其返回 Promise 或使用 async/await 等待 cfire.get() 在您 return 最终对象之前解析某个值。

选项#1

function homepage(formData) {
  const cfire = cfirebase.firestore().collection(...).doc(...)

  return cfire.get()
    .then(doc => {
      if (!doc) {
        throw new Error("Server error")
      }
      if (!doc.exists) {
        throw new Error("Details does not exist")
      }
      // ...
      return { Name, vehical, vehicalNumber }
    })
    .then(result => {
      // result => { Name, vehical, vehicalNumber }
      // ...
      return {
        tripId: {...}
      }
    })
}
// then
homepage(...)
  .then(result => {...})
  .catch(error => {...})

选项 #2

要使用async/await,您必须拥有Node.js 8.x 或更高版本。

async function homepage(formData) {
  try {
    const cfire = cfirebase.firestore().collection(...).doc(...)

    const doc = await cfire.get()

    if (!doc) {
      throw new Error("Server error")
    }

    if (!doc.exists) {
      throw new Error("Details does not exist")
    }

    // ...
    return {
      tripID: {...}
    }
  } catch(error) {
    throw error
  }
}
// then
homepage(...)
  .then(result => {...})
  .catch(error => {...})

阅读更多关于async/await的信息:

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    这是因为 JS 的异步特性。 在 '.then' 块中写下你的 return 语句。

    function homepage(formData) {
         var cfire = cfirebase.firestore().collection('Details').doc('dsadsadasdsadasdsdsdasd');
    
      const test = cfire.get().then(doc => {
        if (doc.exists) {
            Name = doc.data().dd.dn;
            vehical = doc.data().dd.vn;
            vehicalNumber = doc.data().dd.vno;
            console.log(Name, vehical, vehicalNumber);
             return {
                     tripID: {
                        c: false,
    
                        dd: {
                           // Driver name 
                              dn: Name,
                             // Vehical name
                             vn: vehical,
                            // Vehical number
                            vno: vehicalNumber,
                        }
                   }
               };
        } else if (!doc.exists) {
            console.log("Detail does not exist");
            return Promise.reject(new Error('Detail does not exist'));
        } else {
            throw Promise.reject(new Error('Server error!'));
        }
    }).catch(e => {
        return false
    });
    

    }

    【讨论】:

      【解决方案3】:

      你可以这样做

      function homepage(formData) {
          return new Promise((resolve, reject) => {
              var cfire = cfirebase.firestore().collection('Details').doc('dsadsadasdsadasdsdsdasd');
              var returnObj = {
                  tripID: {
                      c: false,
                      dd: {
                          // Driver name 
                          dn: '',
                          // Vehical name
                          vn: '',
                          // Vehical number
                          vno: '',
                      }
                  }
              }
      
              const test = cfire.get().then(doc => {
                  if (doc.exists) {
                      returnObj.tripID.dd.dn = doc.data().dd.dn;
                      returnObj.tripID.dd.vn = doc.data().dd.vn;
                      returnObj.tripID.dd.vno = doc.data().dd.vno;
                      console.log('returnObj => ', returnObj);
                      resolve(returnObj);
                  } else if (!doc.exists) {
                      console.log("Detail does not exist");
                      reject('Detail does not exist');
                  } else {
                      reject('Server error!');
                  }
              }).catch(e => {
                  reject('Server error!');
              });
          });
      }
      

      然后像这样调用函数

      homepage().then((res) => {
          console.log('res => ', res);
      }).catch((err) => {
          console.log(err)
      });
      

      【讨论】:

        猜你喜欢
        • 2021-02-04
        • 1970-01-01
        • 2018-06-30
        • 2020-06-22
        • 2021-03-29
        • 1970-01-01
        • 2020-08-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多