Почему я получаю ошибку «Ожидаемый catch () или return» при попытке подключиться к firestore через cloud-функцию? - PullRequest
0 голосов
/ 28 марта 2019

Я пользуюсь облачным пожарным магазином Google с определенным количеством коллекций. Я пытаюсь написать облачную функцию Google, которая возвращает http: HTTP-запрос на количество коллекций в этом хранилище.

Итак, я написал следующий index.js -файл чертежа из этого вопроса :

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

exports.queryForData = functions.https.onRequest((request, response) => {
    var db = admin.firestore();
    db.get().then(snap => {
        response.status(200).send({length: snap.size});
        })
    }); 

После развертывания я получаю эту ошибку:

enter image description here

Странная вещь: когда я удаляю строку var db = admin.firestore();, я получаю ту же ошибку. Поэтому я подозреваю, что я не правильно подключаюсь к пожарному депо.

Что я делаю не так?

Ответы [ 3 ]

1 голос
/ 28 марта 2019

Вызов в Firestore является асинхронным, и вы должны убедиться, что вы управляете жизненным циклом вашей облачной функции для этого.

В документации говорится следующее

  • Разрешение функций, выполняющих асинхронную обработку (также известную как «фоновые функции»), путем возврата обещания JavaScript.
  • Завершение функций HTTP с помощью res.redirect (), res.send () или res.end ().
  • Завершение синхронного функция с возвратом;заявление.

Вы можете исправить это, просто добавив оператор возврата в db.get().А также, чтобы избавиться от ошибки lint, вы должны вернуть значение из вашего обработчика.Вы можете либо вернуть null, либо просто вернуть response.send()

. Опустив оператор return, неявно преобразуется в undefined ..., что, вероятно, вызывает предупреждение.

exports.queryForData = functions.https.onRequest((request, response) => {
    var db = admin.firestore();
    return db.get().then(snap => {
        response.status(200).send({length: snap.size});
        return null;
        })
    }); 

Возвращенное обещание от db.get() гарантирует, что функция останется в живых до тех пор, пока ваш HTTP-ответ не будет отправлен, а также завершит функцию после разрешения обещания.

При неправильном завершении ваших функций они могут работать до истечения времени ожидания.Посмотрите это видео: https://youtu.be/xu5A1seU6PU?t=233

1 голос
/ 28 марта 2019

Как поясняется в официальном видео по облачной функции HTTP, вы должны добавить блок catch() к своей облачной функции следующим образом:

exports.queryForData = functions.https.onRequest((request, response) => {
    var db = admin.firestore();
    db.get()
    .then(snap => {
       response.status(200).send({length: snap.size});
       //Or response.send({length: snap.size});
    })
    .catch(error => {
       console.log(error);
       response.status(500).send(error);
    })
}); 

Но, кроме того, если я не ошибаюсь, есть (еще одна) ошибка в вашей облачной функции : вы делаете db.get(), но для Firestore нет метода get() сервисный интерфейс . Вы должны вызвать метод get() для CollectionReference, поскольку вы используете метод size() для возвращенного QuerySnapshot (т.е. snap):

exports.queryForData = functions.https.onRequest((request, response) => {
    var db = admin.firestore();
    db.collection('collectionId').get()
    .then(snap => {
       response.status(200).send({length: snap.size});
       //Or response.send({length: snap.size});
    })
    .catch(error => {
       console.log(error);
       response.status(500).send(error);
    })
}); 

Обратите внимание, что вы также можете позвонить get() на DocumentReference.

1 голос
/ 28 марта 2019

Вам необходимо вернуть значение после завершения Promise, в вашем случае вы можете сделать следующее:

exports.queryForData = functions.https.onRequest((request, response) => {
var db = admin.firestore();
return db.get().then(snap => {
     response.status(200).send({length: snap.size});
    })
});
...