在遵循官方的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一起使用。因此,如果在这方面需要进行任何特定的更改,则也应对此提出建议。
答案 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文档,例如here,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),尤其是标题为“ Learn JavaScript Promises”的三个视频。特别要注意的是,对于HTTP触发的功能,您应该只发送响应,而不使用return
。