Использую функции и хостинг от 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.)

Во-первых, вы смешиваете HTTP-запросы на клиенте с вызываемыми функциями. Это не то, что вы должны делать. Изучите документацию для HTTP-функции и вызываемые функции, чтобы увидеть, чем они отличаются. Если вы используете вызываемый SDK на клиенте, вы должны использовать вызываемую функцию на бэкэнде.
Во-вторых, это нормальное ожидаемое поведение. Вызываемые функции используют CORS между клиентом и сервером. Клиенты CORS выдают предполетный запрос, который вызывает первый запрос и первый журнал. Затем фактический запрос, который вызывает второй запрос и второй журнал. Вы не можете избежать этого при использовании CORS - это просто принцип работы протокола.
Смотрите также:
Да, с CORS все работает именно так.
Если вы используете хостинг Firebase, вам, вероятно, не понадобится CORS.
.
Вы можете избежать предпечатных запросов, добавив перезаписи в firebase.json.
Однако существуют такие условия, как положение функции должно быть us-central1.
https://firebase.google.com/docs/hosting/functions
Спасибо за полезный ответ. Если я напишу функцию
onCallи вызову ее один раз, используяhttpsCallable()из клиента, использование будет засчитано как 2. И это не может быть изменено. Я правильно понял?