Итак, я использую 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? И не запускать его, когда я загружаю одну функцию; это тоже было бы полезно.
Спасибо.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Код верхнего уровня для вашего index.js запускается в каждом контейнере, который создает экземпляры Cloud Functions, чтобы гарантировать, что контейнер правильно инициализирован для выполнения ваших функций. Поскольку облачные функции могут создавать экземпляры нескольких контейнеров, код может выполняться несколько раз.
Невозможно контролировать количество контейнеров, создаваемых Cloud Functions. Если вы не хотите, чтобы код запускался в каждом контейнере, не делайте его кодом верхнего уровня в вашем index.js.
Например, вы можете создать учетные данные Spotify по запросу при вызове вашей функции. Это гарантирует, что учетные данные находятся только в контейнерах, в которых фактически вызываются ваши функции, хотя это означает, что при первом вызове вашей функции в контейнере потребуется получить учетные данные Spotify, поэтому для завершения требуется больше времени.
Нет, и способа это настроить. Вот почему вам придется инициализировать его по запросу от каждой функции, которая в нем нуждается.
Пожалуйста, подумайте о добавлении такой вещи в ближайшем будущем. Больно поддерживать состояние токенов для разных API, синхронизированных во многих автономных средах.
Предлагаю вам подать запрос функции.
Сделанный. (^_^) [^ _ ^]
Это очень поучительно. Есть ли простой программный способ сказать «запускать этот высокоуровневый код только в контейнерах, содержащих эту конкретную функцию»? Я могу взломать его с помощью условных операторов, но если для этого есть прекрасное решение Firebase, я хочу знать его; также, если его нет, разумно ли его запросить (простое решение)?