Простая облачная функция Firebase из учебного документа "не может обработать запрос" - PullRequest
0 голосов
/ 25 августа 2018

В соответствии с официальным руководством по облачным функциям Firebase (https://firebase.google.com/docs/functions/get-started), возникает ошибка при попытке фактического развертывания и использования функции (https://firebase.google.com/docs/functions/get-started#deploy-and-execute-addmessage). После успешного завершения развертывания примера функции и инструкции «Добавить параметр текстового запроса к URL-адресу addMessage () и откройте его в браузере ", в результате текст

Ошибка: не удалось обработать запрос

появится в браузере. Осматривая консоль разработчика в браузере, я вижу

Не удалось загрузить ресурс: сервер ответил со статусом 500 ()

(на самом деле не знаю, как это интерпретировать), и, посмотрев статистику использования на панели инструментов firebase, можно увидеть, что функция активирована (просто не работает гладко). Точный код, используемый для развертывания, выглядит как

//import * as functions from 'firebase-functions';

// // Start writing Firebase Functions
// // https://firebase.google.com/docs/functions/typescript
//
// export const helloWorld = functions.https.onRequest((request, response) => {
//  response.send("Hello from Firebase!");
// });

// The Cloud Functions for Firebase SDK to create Cloud Functions and setup triggers.
const functions = require('firebase-functions');

// The Firebase Admin SDK to access the Firebase Realtime Database.
const admin = require('firebase-admin');
admin.initializeApp();


// Take the text parameter passed to this HTTP endpoint and insert it into the
// Realtime Database under the path /messages/:pushId/original
exports.addMessage = functions.https.onRequest((req, res) => {
    // Grab the text parameter.
    const original = req.query.text;
    // Push the new message into the Realtime Database using the Firebase Admin SDK.
    return admin.firestore().ref('/messages').push({original: original})
    .then((snapshot) => {
        // Redirect with 303 SEE OTHER to the URL of the pushed object in the Firebase console.
        return res.redirect(303, snapshot.ref.toString());
    });
});

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


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

1 Ответ

0 голосов
/ 25 августа 2018

Следующая строка в вашем коде неверна:

return admin.firestore().ref('/messages').push({original: original}).then()

Вы «перепутываете» базу данных реального времени и Firestore, которые следует запрашивать (т.е. записывать, читать, удалять) по-разному, так как их данные-модели различаются, см. https://firebase.google.com/docs/firestore/rtdb-vs-firestore. В частности, хотя «база данных реального времени и облачное хранилище пожаров являются базами данных NoSQL», первая «хранит данные в виде одного большого дерева JSON», а вторая «хранит данные в документах, организованных вколлекции ".

На самом деле исходный код из справочного элемента" Начало работы ", на который вы ссылаетесь, нацелен на базу данных реального времени с помощью admin.database()

return admin.database().ref('/messages').push({original: original}).then()

замены,в этой строке кода database() от firestore() не будет работать.

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

Например, вы можете изменить свою облачную функцию следующим образом:

exports.addMessage = functions.https.onRequest((req, res) => {
    // Grab the text parameter.
    const original = req.query.text;

    admin.firestore().collection("mydocs").doc("firstdoc").set({original: original})
    .then(() => {
       console.log("Document successfully written!");
       res.send({original: original});  //Just an example, as there is not that much interest to send back the value of original...  
    })
    .catch(error => {
       console.error("Error writing document: ", error);
       res.status(500).send(error);
   });
})

Наконец, я бы предложил вам посмотретьследующий чиновникВидеоролик «Изучение функций облака для Firebase» ( здесь ), и, в частности, три видеоролика под названием «Изучите обещания JavaScript».В частности, вы заметите, что для запускаемых по HTTP функций вы просто должны отправить ответ , без использования return.

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