Функции firebase выполняются дважды

Использую функции и хостинг от firebase.

Я определил одну функцию, как показано ниже.

const functions = require("firebase-functions")
const cors = require('cors')

exports.hello = functions.https.onRequest((request, response) => {
  functions.logger.info("Hello logs!", {structuredData: true})
  return cors()(request, response, () => {
    response.send({data: 'hello fire functions'})
  })
})

А на хостинге вызовите такую ​​функцию:

import firebase from "firebase/app"
import "firebase/functions"

const config = { ... }
firebase.initializeApp( config )

const test = firebase.functions().httpsCallable('hello')

test().then( result => console.info(result) )

Тогда журнал функций будет записан дважды следующим образом:

2:37:07.548 PM hello: Function execution started
2:37:07.599 PM hello: Hello logs!
2:37:07.600 PM hello: Function execution took 53 ms, finished with status code: 204

2:37:07.809 PM hello: Function execution started
2:37:07.816 PM hello: Hello logs!
2:37:07.817 PM hello: Function execution took 8 ms, finished with status code: 200

Он также дважды отображается на графике использования.

Такое поведение означает, что я должен платить вдвое больше. Это ненормально.

Если cors не используется, журнал и график использования покажут, что он был выполнен только один раз.

Но если вы не используете cors: когда вы вызываете функцию в браузере, функция выполняется, но браузер получает ошибку CORS.

Как я могу решить эту проблему? Я не нашел решения в официальной документации. (Это проблема после развертывания хостинга и функций. Это не среда localhost.)

Интеграция Angular - Firebase Analytics
Интеграция Angular - Firebase Analytics
Узнайте, как настроить Firebase Analytics и отслеживать поведение пользователей в вашем приложении Angular.
2
0
30
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Во-первых, вы смешиваете HTTP-запросы на клиенте с вызываемыми функциями. Это не то, что вы должны делать. Изучите документацию для HTTP-функции и вызываемые функции, чтобы увидеть, чем они отличаются. Если вы используете вызываемый SDK на клиенте, вы должны использовать вызываемую функцию на бэкэнде.

Во-вторых, это нормальное ожидаемое поведение. Вызываемые функции используют CORS между клиентом и сервером. Клиенты CORS выдают предполетный запрос, который вызывает первый запрос и первый журнал. Затем фактический запрос, который вызывает второй запрос и второй журнал. Вы не можете избежать этого при использовании CORS - это просто принцип работы протокола.

Смотрите также:

Спасибо за полезный ответ. Если я напишу функцию onCall и вызову ее один раз, используя httpsCallable() из клиента, использование будет засчитано как 2. И это не может быть изменено. Я правильно понял?

niceplugin 03.04.2021 10:49

Да, с CORS все работает именно так.

Doug Stevenson 03.04.2021 17:57

Если вы используете хостинг Firebase, вам, вероятно, не понадобится CORS.
. Вы можете избежать предпечатных запросов, добавив перезаписи в firebase.json.
Однако существуют такие условия, как положение функции должно быть us-central1. https://firebase.google.com/docs/hosting/functions

Другие вопросы по теме