Как создать и вызвать обещание в NodeJS? - PullRequest
0 голосов
/ 09 апреля 2020

Я пытался позвонить в пожарный магазин с помощью функции, которую я создал с помощью переменной collection.

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, он отказался вернуть ошибку.

Может кто-нибудь помочь мне исправить ее?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

Если вы вызовете вашу функцию с несуществующей коллекцией, она не вернет ошибку, а пустой массив из QueryDocumentSnapshot с. Вот как работает JavaScript SDK.

Вы получите сообщение об ошибке, если, например, попытаетесь получить коллекцию, защищенную правилом безопасности.

Как упоминал jfriend00 вам не нужно создавать собственное обещание, поскольку метод get() уже возвращает обещание. Таким образом, вы можете адаптировать свою функцию следующим образом:

var readFirestore = function(collection) {
    var response = [];
    return db
      .collection(collection)
      .get()
      .then((snapshot) => {
        snapshot.forEach((doc) => {
          response.push(doc.id);
        });
        return response;
      })
  }
0 голосов
/ 09 апреля 2020

Вы не передали обработчик 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);
    }
}
...