【发布时间】:2022-08-19 16:57:58
【问题描述】:
我正在尝试使用 Firebase Cloud Functions 创建 API,以便构建一个系统,使通过 API 收集的内容和其他第三方 API 定期保存到 Firestore。这是我此刻的源代码index.js,我想控制这个文件中的所有进程。
/functions/index.js
const firebaseAdmin = require(\"firebase-admin\");
const firebaseFunctions = require(\"firebase-functions\");
firebaseAdmin.initializeApp();
const fireStore = firebaseAdmin.firestore();
const express = require(\"express\");
const axios = require(\"axios\");
const cors = require(\"cors\");
const serviceToken = \"SERVICE-TOKEN\";
const serviceBaseUrl = \"https://api.service.com/\";
const app = express();
app.use(cors());
const getAllExamples = async () => {
var url = `${serviceBaseUrl}/examples?token=${serviceToken}`;
var config = {
method: \"get\",
url: url,
headers: {}
};
axios(config).then((res) => {
console.log(\"Data saved!\");
return res.data;
}).catch((err) => {
console.log(\"Data not saved: \", err);
return err;
});
}
const setExample = async (documentId, dataObject) => {
fireStore.collection(\"examples\").doc(documentId).set(dataObject).then(() => {
console.log(\"Document written!\");
}).catch((err) => {
console.log(\"Document not written: \", err);
});
}
app.get(\"/getAllExamples\", (req, res) => {
getAllExamples().then((response) => res.send(response));
});
app.put(\"/setExample\", (req, res) => {
setExample(req.params.documentId).then((response) => res.send(response));
});
const api = firebaseFunctions.https.onRequest(app);
module.exports = { api };
module.exports.updateExamplesRoutinely = firebaseFunctions.pubsub.schedule(\"0 0 * * *\").timeZone(\"America/Los_Angeles\").onRun((context) => {
var examples = getAllExamples();
for(var i = 0; i < examples.length; i++) {
var example = examples[i];
var exampleId = example[\"id\"];
if(exampleId && example) setExample(exampleId, example);
}
});
因此,updateExamplesRoutinely 在太平洋标准时间每 00:00 正确触发,但没有数据存储在 Firebase 中,也没有关于 Firebase 数据更新的控制台日志,也没有在 Cloud Functions 日志中找到。
通过https://api.service.com/ 收集的输出数据如下所示:
[
{
id: \"BB345\",
name: \"Tim Gordon\",
age: 24,
email: \"tgordon@yahoo.com\"
},
{
id: \"CC098\",
name: \"John Doe\",
age: 28,
email: \"john.doe@gmail.com\"
},
{
id: \"DD777\",
name: \"Adam Smith\",
age: 39,
email: \"adamsmith@outlook.com\"
},
...
]
简单地说,这三个问题是我想要解决的。
- 我应该如何通过 Cloud Functions\' 调度程序调用在
index.js中定义的 API? - 我应该如何将数据保存到 Cloud Functions\' 调度程序内的 Firestore?
- 调用第三方 API、等待并收集结果并将其传递给其他事件或函数的最佳“异步”方式是什么?
标签: node.js firebase express axios google-cloud-functions