Firestore требуется более минуты, чтобы получить документ внутри облачной функции Firebase

#javascript #firebase #performance #google-cloud-firestore #google-cloud-functions

#javascript #firebase #Производительность #google-cloud-firestore #google-cloud-функции

Вопрос:

Я пытаюсь получить документ внутри, используя firebase-admin в облачной функции триггера в Firebase :

 exports.onTransactionCreated = functions.firestore
  .document("transaction/{id}")
  .onCreate((snapshot, context) => {
    const first = Date.now();
    admin.firestore().collection('myCollection').doc(snapshot.data().myDocumentId).get()
    .then((documentSnapshot) => {
      const second = Date.now();
      functions.logger.log(`seconds total = ${Math.floor((third - first) / 1000)}`);
    }
}
  

Журнал консоли показывает этот результат :

 seconds bw 1-2 elapsed = 140
  

Используемые версии :

 "engines": {
    "node": "12"
  },
 "dependencies": {
    "firebase-admin": "^9.2.0",
    "firebase-functions": "^3.11.0"
  }
  

При каких обстоятельствах документ может быть таким длинным для извлечения? Даже в случае холодного запуска я не могу поверить, что это будет так долго.
Эта проблема на самом деле является большой проблемой для моего приложения, и я был бы признателен за любую помощь.

Ответ №1:

Ваша функция должна возвращать обещание, которое разрешается после завершения всей асинхронной работы. Прямо сейчас ваша функция ничего не возвращает, что означает, что она завершится, ничего не дожидаясь.

Как минимум, вы должны вернуть обещание, возвращенное get().then(...) .

 exports.onTransactionCreated = functions.firestore
  .document("transaction/{id}")
  .onCreate((snapshot, context) => {
    const first = Date.now();
    return admin.firestore().collection('myCollection').doc(snapshot.data().myDocumentId).get()
    .then((documentSnapshot) => {
      const second = Date.now();
      functions.logger.log(`seconds total = ${Math.floor((third - first) / 1000)}`);
    }
}
  

Пожалуйста, обратитесь к документации для получения дополнительной информации. Правильная обработка обещаний имеет решающее значение для правильной работы функций.

Комментарии:

1. Большое вам спасибо за этот ответ. В конце моего onCreate я вернул 0; и подумал, что это будет то, что нужно.