Как запустить облачную функцию с интервалом?

#firebase #scheduled-tasks #google-cloud-pubsub

#огневая база #запланированные задачи #google-cloud-pubsub

Вопрос:

Я пытался сделать что-то в этом роде:

 export const refreshJob = functions.pubsub
    .schedule("every 1 minutes")
    .onRun(() => helloWorld());

export const helloWorld = functions.https.......
 

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

Спасибо.

Ответ №1:

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

Вызываемая функция HTTPS

Если ваша существующая функция является вызываемой функцией HTTPS, это выглядит так:

 export const refreshJob = functions.pubsub
    .schedule("every 1 minutes")
    .onRun(() => helloWorld());

export const helloWorld = functions.https.onCall((data, context) => {
  // do the task
  // make sure to return a Promise
});
 

вы бы отредактировали ее в:

 export const refreshJob = functions.pubsub
    .schedule("every 1 minutes")
    .onRun((context) => {
      // do the task
      // make sure to return a Promise
    });
 

Если вы хотите, чтобы ваша функция была вызываемой и выполнялась по расписанию, вы могли бы вместо этого использовать:

 function handleHelloWorldTask(data, context) {
  // do the task
  // make sure to return a Promise
}

export const refreshJob = functions.pubsub
    .schedule("every 1 minutes")
    .onRun((context) => handleHelloWorldTask({ scheduled: true }, context));

export const helloWorld = functions.https.onCall(handleHelloWorldTask);
 

Обработчик запросов HTTPS

Если ваша существующая функция является обработчиком запросов HTTPS, вы бы использовали:

 const FIREBASE_PROJECT_ID = JSON.parse(process.env.FIREBASE_CONFIG).projectId;

export const refreshJob = functions.pubsub
    .schedule("every 1 minutes")
    .onRun(async (context) => {
      const response = await fetch(`https://us-central1-${FIREBASE_PROJECT_ID}.cloudfunctions.net/helloWorld`);
      if (response.ok) {
        console.log('Triggered helloWorld successfully');
      } else {
        throw new Error(`Unexpected status code ${response.status} from helloWorld: ${await response.text()}`);
      }
    });

export const helloWorld = functions.https.onRequest((req, res) => {
  // do the task
  // make sure to call res.end(), res.send() or res.json()
});
 

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

1. Отлично! Спасибо!

2. @ChrisWingler если это ответ на ваш вопрос, не забудьте отметить его как принятый ответ.