firebase - Firebase 云函数导致 Firestore 读取量激增?
问题描述
我编写了一个 Firebase 云函数来从外部 api 获取数据并读/写到 Firestore。我用“firebase serve”在本地运行了几次该功能。然后我注意到每小时进行了大约 500 次 Firestore API 调用,即使没有调用该函数也是如此。Firestore Writes and Deletes 保持为 0,只有 Reads 增加。
仅当我关闭计算机时,读取的峰值才停止,因此我相信云功能是原因。
const functions = require('firebase-functions');
const admin = require('firebase-admin');
const axios = require('axios');
admin.initializeApp();
exports.someFunc = functions.https.onRequest((request, response) => {
const url = 'https://someurl.com';
const getData = async url => {
try {
const response = await axios.get(url);
const data = response.data;
if (data.status === 'ok') {
data.articles.forEach(element => {
if (element.author) {
element.author = element.author.replace(/\//g, ',');
var authorRef = admin
.firestore()
.collection('authors')
.doc(element.author);
authorRef
.get()
.then(doc => {
if (!doc.exists) {
authorRef.set({
sources: [element.source.name]
});
} else {
var sources = doc.data().sources;
if (!sources.includes(element.source.name)) {
sources.push(element.source.name);
authorRef.update({
sources: sources
});
}
}
return null;
})
.catch(error => {
console.log('Error getting document:', error);
});
}
if (element.source.name) {
element.source.name = element.source.name.replace(/\//g, ',');
var sourceRef = admin
.firestore()
.collection('sources')
.doc(element.source.name);
sourceRef
.get()
.then(doc => {
if (!doc.exists) {
var sourceUrl = 'https://' + element.url.split('/')[2];
sourceRef.set({
sourceUrl: sourceUrl
});
}
return null;
})
.catch(error => {
console.log('Error getting document:', error);
});
}
admin
.firestore()
.collection('articles')
.add(element);
});
}
} catch (error) {
console.log(error);
}
};
getData(url);
response.send('Success!');
});
'authors'、'sources' 和 'articles' 集合每个最多只有 20 个文档,所以肯定有一些东西反复调用我找不到的 Firestore。
解决方案
虽然这看起来像是一个定价问题,但我认为这可能是Cloud Functions Retries的问题,而且您的使用次数与代码不匹配,因为您有Set 和 Update 方法,这将至少进行一次写入。您可能想检查您的函数是否成功执行。
如果您想了解 Firestore 定价,这可能会有所帮助。
Firebase Firestore 读取基于许多参数,例如
- 要求的文件数量
- 如果您正在收听更改,则实时更新集合
- Firebase Firestore 安全规则(每次必须评估您的规则时)
- 使用分页时请求的页数
你可以在这里找到详细的解释
还有一些例子在这里
推荐阅读
- excel - 在 Excel 中,如何根据其他单元格的标准找到单元格的平均值?
- bash - 使用文件行作为参数执行命令的 Bash 脚本
- python - Python Pandas:分类变量上的 Group BY 函数
- python - stats.truncnorm.rvs 中的“ValueError:参数中的域错误”指的是什么?
- apache - Apache 403 禁止访问被拒绝
- postgresql - 查询结构与函数结果类型 postgresql 不匹配
- python - 如何使用 python 将 CSV 文件导入 SQLite3
- r - 我想在 R 中使用 Wolfram 中使用的函数 EllipticE( )、ElliptctcF( ) EllipticK( ) 函数
- javascript - 函数 if 和 for 循环 const 数组中的偶数
- vue.js - Vue:使用计算属性将参数从应用程序传递到组件并返回