Как запретить функциям Firebase выполнять локальные функции один раз для каждой облачной функции?

Итак, я использую API Spotify для поиска. Я тестировал свой код локально, используя tsc и node; все работает как положено.

Однако, когда я развертываю свой index.ts, журналы указывают на странное поведение.

Вверху файла у меня есть следующее:

 //Load libraries
const functions      = require('firebase-functions');
const admin          = require('firebase-admin');
const firebase       = require("firebase");
const stripe         = require('stripe')(functions.config().stripe.token)
const SpotifyWebApi    = require('spotify-web-api-node');

//Initialize app
const APP = { 
  apiKey: "my-API-Key",  
  authDomain: "My domain auth",
  databaseURL: "my databse url",
  storageBucket: "my bucket",
  messagingSenderId: "my messenger ID"
}

//The Client Credential Flow for Spotify API
const spotifyApi = new SpotifyWebApi({
    clientId: 'My cliend ID',
    clientSecret: 'My-secret-Key'
});

// Retrieve an access token for Spotify.
spotifyApi.clientCredentialsGrant().then(function (data) {
    console.info('All data Spotify API: ' + data.body )
    console.info('The access token expires in ' + data.body['expires_in']);
    console.info('The access token is ' + data.body['access_token']);
    // Save the access token so that it's used in future calls
    spotifyApi.setAccessToken(data.body['access_token']);
}, function (err) {
    console.info('Something went wrong when retrieving an access token', err);
})

firebase.initializeApp(APP);
admin.initializeApp(APP)

Проблема в том, что в журналах указано, что функция токена доступа spotify запускается один раз для каждой функции Firebase-Cloud в моем файле index.js. Я получаю более дюжины токенов, каждый из которых отображается в журнале при вызове одной из моих облачных функций firebase.

Как сообщить функциям Firebase, чтобы они запускали этот код один раз и только один раз, когда я загружаю весь свой index.ts? И не запускать его, когда я загружаю одну функцию; это тоже было бы полезно.

Спасибо.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
461
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Код верхнего уровня для вашего index.js запускается в каждом контейнере, который создает экземпляры Cloud Functions, чтобы гарантировать, что контейнер правильно инициализирован для выполнения ваших функций. Поскольку облачные функции могут создавать экземпляры нескольких контейнеров, код может выполняться несколько раз.

Невозможно контролировать количество контейнеров, создаваемых Cloud Functions. Если вы не хотите, чтобы код запускался в каждом контейнере, не делайте его кодом верхнего уровня в вашем index.js.

Например, вы можете создать учетные данные Spotify по запросу при вызове вашей функции. Это гарантирует, что учетные данные находятся только в контейнерах, в которых фактически вызываются ваши функции, хотя это означает, что при первом вызове вашей функции в контейнере потребуется получить учетные данные Spotify, поэтому для завершения требуется больше времени.

Это очень поучительно. Есть ли простой программный способ сказать «запускать этот высокоуровневый код только в контейнерах, содержащих эту конкретную функцию»? Я могу взломать его с помощью условных операторов, но если для этого есть прекрасное решение Firebase, я хочу знать его; также, если его нет, разумно ли его запросить (простое решение)?

ReverseFlow 25.11.2018 05:03

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

Frank van Puffelen 25.11.2018 06:24

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

ReverseFlow 25.11.2018 06:51

Предлагаю вам подать запрос функции.

Frank van Puffelen 25.11.2018 15:44

Сделанный. (^_^) [^ _ ^]

ReverseFlow 25.11.2018 15:54

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