来自教程文档的简单firebase云函数“无法处理请求”

hyrbngr7  于 2023-05-18  发布在  其他
关注(0)|答案(1)|浏览(116)

遵循官方firebase云函数教程(https://firebase.google.com/docs/functions/get-started),在尝试实际部署和使用该函数时遇到错误(https://firebase.google.com/docs/functions/get-started#deploy-and-execute-addmessage)。在成功完成示例函数的部署并指示“将文本查询参数添加到addMessage()URL,并在浏览器中打开”之后,结果是
错误:无法处理请求
将显示在浏览器中。在浏览器中检查开发者控制台,我看到了
无法加载资源:服务器以状态500()响应
(don实际上不知道如何解释这一点),并查看FireBase Jmeter 板中的使用统计,可以看到该功能正在被激活(只是工作不顺利)。用于部署的确切代码如下所示

//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());
    });
});

从来没有使用过谷歌云功能之前和任何调试信息或解决方案什么可能会出错在这里将不胜感激。
最终,我希望最终使用云函数与firestoreDB一起工作,而官方教程似乎是打算与firebaseDB一起使用。因此,如果在这方面需要作出任何特别的改变,也将不胜感激。

p3rjfoxz

p3rjfoxz1#

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

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

你把真实的数据库和Firestore“混在一起”了,这两个数据库应该被查询(即write、read、delete)不同,因为它们的数据模型不同,参见https://firebase.google.com/docs/firestore/rtdb-vs-firestore。特别是,虽然“Realtime Database和Cloud Firestore都是NoSQL数据库”,但前者“将数据存储为一个大型JSON树”,而后者“将数据存储在以集合形式组织的文档中”。
事实上,您所参考的“入门”帮助项中的原始代码是针对真实的数据库的admin.database()

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

在这行代码中,用firestore()替换database()将不起作用。
你应该看看Firestore文档,here,这里和here,以了解如何写入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),特别是标题为“学习JavaScript承诺”的三个视频。您将特别注意到,对于HTTP触发函数**,您应该只发送响应**,而不使用return

相关问题