Облачная функция Firebase вызывается по бесконечной петле - PullRequest
0 голосов
/ 19 октября 2018

У меня есть облачная функция, которая используется для отправки электронных писем, и она размещена в дочернем приложении Firebase.Время ожидания установлено равным 60 секундам, и оно вызывается через запрос https.Однако, когда запрос сделан из пользовательского интерфейса, он вызывается каждые 60 секунд, а затем истекает время ожидания, даже если отправляется электронное письмо.

Component.ts - действие отправки формы

      onSubmit() {
          this.cloudService.sendEmail(
              this.model.name,
              this.model.email,
              this.model.message
          );
        }

CloudFunctionService.ts

    export class CloudFunctionService {
      constructor(private http: HttpClient) {}

      sendEmail(name, email, message) {
        const url = 'https://url/path/to/function';

        const params = new HttpParams()
          .set('name', name)
          .set('email', email)
          .set('message', message);

        return this.http.get(url, {params}).toPromise()
          .then(res => {
            // this line never gets hit
            console.log(res);
          })
          .catch(err => {
            // this line never gets hit
            console.log(err);
          });
      }
    }

index.ts - машинописный код для функции

    import * as functions from 'firebase-functions';
    import * as sgMail from '@sendgrid/mail';
    import * as cors from 'cors';
    const corsHandler = cors({origin: true});

    export const sendContactMail = functions.https.onRequest((request, response) => {
      corsHandler(request, response, () => { console.log('cors handled')});

      const SENDGRID_API_KEY = functions.config().sendgrid.key;
      sgMail.setApiKey(SENDGRID_API_KEY);
      sgMail.setSubstitutionWrappers('{{','}}');

      const msg = {
        to: 'some@email.com',
        from: 'some.other@email.com',
        templateId: 'mytemplateid',
        substitutions: {
          name: request.query.name,
          email: request.query.email,
          message: request.query.message
        }
      };

        sgMail.send(msg).then((res) => {
            console.log(res);
           }).catch(err => {
            console.log(err);
          });

        response.send();
    });

Журнал функций Firebase

Фантом перезапускается каждые 60 секунд только для повторного тайм-аута

Даже если я получаю электронные письма от функции

1 Ответ

0 голосов
/ 19 октября 2018

Функции типа HTTP должны отправить ответ клиенту для завершения функции.Ваша функция ничего не отправляет клиенту в течение тайм-аута по умолчанию, поэтому Cloud Functions должна предположить, что это не удалось.Затем он может также повторить попытку функции, поскольку предполагалось, что она завершится с ошибкой.

Из документации :

Завершить функции HTTP с помощью res.redirect (),res.send () или res.end ().

...