【问题标题】:How to create and call a promise in NodeJS?如何在 NodeJS 中创建和调用 Promise?
【发布时间】:2020-07-22 03:37:36
【问题描述】:

我一直在尝试使用我使用 collection 变量创建的函数来调用 firestore。

var readFirestore = function(collection, doc){
    return promise = new Promise(function(resolve,reject){
      //If doc param is null Query collection
      if(doc == null || doc == "" || doc == undefined){
        var response = [];
        db.collection(collection).get()
        .catch((err) => {
          console.log('Error getting documents: ', err);
          reject(err);
      })
        .then((snapshot) => {
          snapshot.forEach((doc) => {
            response.push(doc.id);
          });
          console.log(response);
          resolve(response);

        });

      }

    });
}

我通过appp.get调用它

app.get('/post', (req, res) => {
    readFirestore('fake',null).then(response => {
       res.json(response);
    }),(err) => {
      console.log(err);
      res.send(err);
  }

});

它可以工作,但是当我尝试通过给它一个错误的collection 变量来测试 catch 时,它拒绝返回错误。

谁能帮我解决一下?

谢谢。

【问题讨论】:

  • 你看到Error getting documents的日志了吗?
  • @ManuelSpigolon 不

标签: javascript node.js firebase promise google-cloud-firestore


【解决方案1】:

您没有正确传递 catch 处理程序。

改变这个:

app.get('/post', (req, res) => {
    readFirestore('fake',null).then(response => {
       res.json(response);
    }),(err) => {
      console.log(err);
      res.send(err);
  }

});

到这里:

app.get('/post', (req, res) => {
    readFirestore('fake',null).then(response => {
       res.json(response);
    }, (err) => {
      console.log(err);
      res.send(err);
    });
});

另外,readFirestore() 不需要创建自己的承诺(这是一种反模式)。它可以返回你已经拥有的承诺。

这是一个重组后的readFirestore() 函数:

function readFirestore(collection, doc) {
    //If doc param is null Query collection
    if (!doc) {
        return db.collection(collection).get().then((snapshot) => {
            const response = [];
            snapshot.forEach((doc) => {
                response.push(doc.id);
            });
            return response;
        }).catch((err) => {
            // log the error, then rethrow
            // or, if you don't need to log the error here, then just get rid of the .catch()
            // here entirely as it doesn't change your logic flow, it's only here for logging
            console.log('Error getting documents: ', err);
            throw err;
        });
    } else {
        // it's unclear what you want returned here, but you need to return a promise
        // that resolves to something - you need to fill in this logic
        return Promise.resolve(null);
    }
}

【讨论】:

  • 谢谢,但是如何停止 readFirestore() 中的反模式?
  • @UmarYusuf - 我在我的答案中添加了一个重组的readFirestore()
【解决方案2】:

如果您使用不存在的 Collection 调用您的函数,它不会返回错误,而是返回一个空数组 QueryDocumentSnapshots。这就是 JavaScript SDK 的工作原理。

例如,如果您尝试获取受安全规则保护的集合,则会出现错误。

正如 jfriend00 所提到的,您不需要创建自己的 Promise,因为 get() 方法已经返回了 Promise。因此,您可以按如下方式调整您的功能:

var readFirestore = function(collection) {
    var response = [];
    return db
      .collection(collection)
      .get()
      .then((snapshot) => {
        snapshot.forEach((doc) => {
          response.push(doc.id);
        });
        return response;
      })
  }

【讨论】:

  • 错误处理是什么? db.collection(collection).get() 有一个 .catch() ,它返回一个错误。我想抓住它并扔掉它并在app.get中使用。
  • 如果在readFirestore 中抛出错误,您会将其放入调用函数中。您可以尝试通过修改 Firestore 安全规则以不允许读取。
猜你喜欢
  • 2014-01-30
  • 1970-01-01
  • 1970-01-01
  • 2017-07-26
  • 2016-06-22
  • 2017-12-24
  • 1970-01-01
  • 1970-01-01
  • 2020-02-08
相关资源
最近更新 更多