Не могу получить доступ к базе данных из функции Firebase - PullRequest
0 голосов
/ 03 мая 2019

Я перепробовал все, у меня есть эта облачная функция (которая в противном случае работает):

     exports.contentServer = functions.https.onRequest((request, response) => {
          admin.database().ref('/list/' + "abc").once('value').then(function(snapshot) {
              console.log(snapshot.val() );
              return null;
              }).catch(function(error) {
                  console.log("Error getting document:", error);
                  return response.send(error);
              });

 });

или также это:

     admin.database().ref('/list').once('value').then(function(snapshot) {
        var event = snapshot.val();   
        app.tell('Result: '+event);
   });

и это:

     exports.contentServer = functions.https.onRequest((request, response) => {


          var db = admin.database();


            db.ref("list/abc").once("value").then(snap => {
              var store = snap.val().description;
              return store;
            }).then(() => {
              var store = snap.val().description;
              return store;
            }).then(snap => {
              var store = snap.val().description;
              return store;
            }).catch(err => {
              console.log(err);
              response.send("error occurred");
            });

 });

и всегда возвращаю ошибку:

«Не удалось обработать запрос»

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

 Each then() should return a value or throw 

У меня есть коллекция с именем list , внутри у меня есть документ с именем "abc" .

Есть что-то, что я должен включить? что-то, что я должен настроить в Firebase, чтобы это работало? ничего базового никто не пишет на документах?

Ответы [ 2 ]

2 голосов
/ 03 мая 2019

Изменено после комментариев, поясняющих, что OP использует Firestore, а не базу данных реального времени

Вы должны сделать следующее.Вам нужно подождать, пока обещание, возвращенное методом get(), разрешится, прежде чем отправлять ответ обратно.Для этого вам нужно использовать метод then(), см. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then

 exports.contentServer = functions.https.onRequest((request, response) => {
      admin.firestore().collection('list').doc('abc').get()
      .then(docSnapshot => {
          console.log(docSnapshot.data());
          return response.send(docSnapshot.data()); // or any other value, like return response.send( {result: "success"} );
      })
      .catch(error => {
          console.log("Error getting document:", error);
          return response.status(500).send(error); 
      });
});

. Как написано в комментариях выше, я бы посоветовал вам посмотреть 3 видео о "Обещаниях JavaScript" из видео Firebase.серия: https://firebase.google.com/docs/functions/video-series/

0 голосов
/ 03 мая 2019

Попробуйте это

Обновлено .Верните ответ внутри then() как и то, на что указал @Renaud Tarnec.

Использование базы данных в реальном времени

exports.contentServer = functions.https.onRequest((request, response) => {
     var database = admin.database();
     database.ref('list').child('abc').once("value", snapshot => {
         const data = snapshot.val();
         return response.send(data);
     }).catch(error => {
         return response.status(500).send(error); 
     });
});

Если вы используете firestore.

exports.contentServer = functions.https.onRequest((request, response) => {
     const firestore = admin.firestore();
     firestore.collection("list").doc('abc').get().then(doc => {
         console.log(doc.data());
         return response.send(doc.data());
     }).catch(error => {
         return response.status(500).send(error);
     });
});

Важно: не забудьте прекратить запрос, вызвав response.redirect(), response.send(), or responses.end(), чтобы выможет избежать чрезмерных расходов от функций, которые работают слишком долго

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...