javascript - Firebase / Cloud Function 很慢
问题描述
我有一个 Firebase 云函数,它执行以下操作:
const firestore = require('firebase-admin')
const functions = require('firebase-functions')
const regex = require('../../utils/regex')
exports = module.exports = functions.https.onCall((data, context) => {
if (!context.auth) {
throw new functions.https.HttpsError('failed-precondition', 'The function must be called while authenticated.')
}
if (!data['displayName']) {
throw new functions.https.HttpsError('failed-precondition', 'An display name must be provided.')
}
if (!regex.noSpecialCharactersExceptSpace.test(data['displayName'])) {
throw new functions.https.HttpsError('input-validation-failed', 'Your display name cannot have special characters in it.')
}
return firestore.firestore().collection('profiles').doc(context.auth.uid)
.update({
displayName: data['displayName']
})
.then(() => {
console.info('Successful public profile update user='+ context.auth.uid)
return { text: 'Your profile has successfully been updated' };
})
.catch((error) => {
console.error('Error updating public profile user=' + context.auth.uid + ' error=' + error)
throw new functions.https.HttpsError('failed-precondition', 'An error happened, our team will look into it.')
})
})
在我的前端,当我调用这个函数时,它可能需要 20-30 秒才能完成并返回一个状态码。这种延迟确实会破坏用户体验。
改善响应时间的最佳方法是什么?
测试
从 UI 直接调用 Firestore 的速度非常快。因此,问题似乎不太可能是我们这边的 DNS。
从 UI 对 Cloud Function 的其他 API 调用,例如“邀请朋友”,可以快速解决,并且不受此故障的影响。
对不返回 Promise 的其他 Cloud Functions 的调用,但会执行诸如发送带有 Postmark 的电子邮件之类的操作,不受此故障的影响,并且解决的速度也非常快。因此,问题似乎不在于 Firebase 项目的位置 (
us-central1
)。尽管更改位置尚未经过测试。故障只发生在这一项功能上。上面复制粘贴的那个。
受影响的函数和我们的其他函数之间的唯一区别是,有错误的函数返回一个用于 Firestore 操作的 Promise。
解决方案
推荐阅读
- google-apps-script - 将 Google 日历中的出席、未出席和无响应导出到 Google 表格的脚本
- laravel - socket.io 转无任何结果
- react-native - 在没有 ctrl m 菜单的情况下反应本机应用程序更改主机端口
- spire.doc - spire.doc 无法将数据从 doc/rtf 文件转换为 pdf
- shiny - Flexdashboard 使用每个用户输入打开新选项卡
- firebase - React Redux Firebase:firebaseConnect 出错 - 无法读取未定义的“有序”属性
- php - 如何转义在 PHP 中具有默认值的函数参数?
- android - 单击小部件按钮时调用带有改造的 API
- android - Supernova Emoji 库与 Android 中的 socket.io 聊天应用程序集成
- javascript - 每次向 DOM 中添加不同坐标的元素