我需要一些帮助和支持来解决Firebase的云功能中的性能问题。我将async / await与try / catch块结合使用,使我的代码更具可读性。
我有一个简单的函数,它根据队列写入事件中的params键值写入数据库中的两个位置。
这个简单的功能平均需要1500毫秒才能完成。对于简单的数据库任务写入,我认为似乎有点长。我认为我在代码中犯了一个错误,并且部分代码无法正确解析。
云功能
export const watchRegisterJobs = functions.database.ref(`queues/register/{$key}`).onWrite(
async (event: Event<any>) => {
if (!event.data.exists()) {
return;
}
if (event.data.exists()) {
const formData = event.data.val();
let key;
event.params&&(key=event.params.$key);
if (key) {
console.log('New user with the following id', key)
try {
await addUser(formData, key)
} catch (error) {
console.log('can not add user to database', error)
}
try {
await addOrganization(formData, key)
} catch (error) {
console.log('can not add organization to database', error)
}
try {
await event.data.ref.remove();
} catch (error) {
console.log('can not remove job')
}
return;
}
}
}
)
帮助程序功能
export const addUser = async (data, key) => {
const dataToSave = {
information: ....,
organizations: .....
};
try {
return await admin.database().ref(`users/${key}`).set(dataToSave);
} catch (error) {
return error;
}
}
export const addOrganization = async (data, key) => {
const organization = {
...
}
try {
return await admin.database().ref(`organizations/${key}`).set(organization);
} catch (error) {
return error;
}
}
更新 根据评论,我对代码做了一些改进。性能仍然相同,但代码看起来更好。
云功能
export const watchRegisterJobs = functions.database.ref(`queues/register/{$key}`).onWrite(
async (event: Event<any>) => {
if (!event.data.exists()) {
return;
}
const formData = event.data.val();
let key;
if(event.params) {
key = event.params.$key;
}
if (key) {
console.log('New user with the following id', key)
try {
await addUser(formData, key)
await addOrganization(formData, key)
await event.data.ref.remove();
} catch (error) {
console.log('can not write to the database', error)
}
return;
}
}
)
助手
export const addUser = (data, key) => {
const dataToSave = {
information: ....,
organizations: ....
};
return admin.database().ref(`users/${key}`).set(dataToSave);
}
export const addOrganization = (data, key) => {
const organization = {
...
}
return admin.database().ref(`organizations/${key}`).set(organization);
}
答案 0 :(得分:1)
看到你的代码看起来没问题(我没有看到任何不返回的代码路径),我只是用异步等待我自己的测试,这是我的结果:
我怀疑你的功能已经冷却了。在代码更新后第一次执行函数时,Firebase需要设置环境,这在第一次需要一段时间。当函数暂时没有使用时也会发生同样的情况。
其中一位开发者提供了更多信息:Firebase cloud functions is very slow
编辑:忘记提及我使用的是打字稿。这意味着我的代码显然会被转换,因为Firebase本身并不支持async / await。我怀疑你在做类似的事情。还注意到你的最后一个val formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ")
println(formatter.print(dt))
应该向下移动一级(如果key为null)。