首页 > 解决方案 > 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 秒才能完成并返回一个状态码。这种延迟确实会破坏用户体验。

改善响应时间的最佳方法是什么?

测试

  1. 从 UI 直接调用 Firestore 的速度非常快。因此,问题似乎不太可能是我们这边的 DNS。

  2. 从 UI 对 Cloud Function 的其他 API 调用,例如“邀请朋友”,可以快速解决,并且不受此故障的影响。

  3. 对不返回 Promise 的其他 Cloud Functions 的调用,但会执行诸如发送带有 Postmark 的电子邮件之类的操作,不受此故障的影响,并且解决的速度也非常快。因此,问题似乎不在于 Firebase 项目的位置 ( us-central1)。尽管更改位置尚未经过测试。

  4. 故障只发生在这一项功能上。上面复制粘贴的那个。

  5. 受影响的函数和我们的其他函数之间的唯一区别是,有错误的函数返回一个用于 Firestore 操作的 Promise。

标签: javascriptfirebasegoogle-cloud-firestoregoogle-cloud-functions

解决方案


推荐阅读