教程文档中的简单Firebase云功能“无法处理请求”

时间:2018-08-25 06:50:39

标签: firebase google-cloud-firestore google-cloud-functions

在遵循官方的Firebase云功能教程(https://firebase.google.com/docs/functions/get-started)之后,尝试实际部署和使用该功能(https://firebase.google.com/docs/functions/get-started#deploy-and-execute-addmessage)时出错。成功完成示例函数的部署并指示“将文本查询参数添加到addMessage()URL,并在浏览器中打开它”后,结果是文本

  

错误:无法处理请求

出现在浏览器中。我在浏览器中检查了开发者控制台,

  

无法加载资源:服务器的状态为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 :(得分:1)

您的代码中的以下行是错误的:

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

您正在“混合”应以不同方式查询(即写入,读取,删除)的实时数据库和Firestore,因为它们的数据模型不同,请参见https://firebase.google.com/docs/firestore/rtdb-vs-firestore。特别是,“实时数据库和Cloud Firestore均为NoSQL数据库”时,第一个“将数据存储为一个大JSON树”,而第二个“将数据存储在按集合组织的文档中”。

事实上,您所引用的“入门”帮助项目中的原始代码使用admin.database()来定位实时数据库

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

在此代码行中,用database()替换firestore()无效。

您应该查看Firestore文档,例如hereherehere,以了解如何写入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的云功能”(here),尤其是标题为“ Learn JavaScript Promises”的三个视频。特别要注意的是,对于HTTP触发的功能,您应该只发送响应,而不使用return