Облачная функция Firebase onWrite срабатывает несколько раз

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

Я подтвердил, что отправляю полезную нагрузку только один раз, и данные записываются в базу данных в полном порядке. Проблема, с которой я столкнулся, заключается в том, что onWrite отвечает на каждую строку записи в базе данных, например. Я отправляю имя, адрес электронной почты, компанию и сообщение, поэтому моя функция вызывается 4 раза. Я НЕ переписываю в базу данных, которая, как мне известно, выполняет еще один вызов. Строка данных получается при каждом вызове в виде отдельных значений, я не получаю объект со всеми значениями, как «обещано» в документации. Я также пробовал onCreate, который даже не был вызван.

Я дезинформирован? Это ожидаемое поведение? Любая помощь приветствуется.

Код...

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

exports.sendContactMessage = functions.database
  .ref('/messages/{pushKey}')
  .onWrite(event => {
    const snapshot = event.data;
    // Only send email for new messages.
    if (!snapshot.exists()) { return null; }

    const val = snapshot.val();

    console.log(val);
  });

Мой класс, который публикует сообщения в "сообщениях" ...

import { Component } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { AngularFireDatabase, AngularFireObject } from 'angularfire2/database';
import * as firebase from 'firebase/app';

export interface Item { name: string; email: string; message: string; html: string; date: string }

@Component({
  selector: 'app-contact',
  templateUrl: './contact.component.html',
  styleUrls: ['./contact.component.scss']
})
export class ContactComponent {
      public rForm: FormGroup;
      public post: any;
      public message: string = '';
      public name: string = '';
      public company: string = '';
      public email: string = '';
      itemRef: AngularFireObject<any[]>;
      item;

  constructor(private fb: FormBuilder, public db: AngularFireDatabase) {
    this.createForm();
    this.itemRef = db.object('messages');
    this.item = this.itemRef.valueChanges();
  }

  createForm() {
    this.rForm = this.fb.group({
      name: [null, Validators.required],
      email: [null, Validators.compose([Validators.required, Validators.email])],
      message: [null, Validators.compose([Validators.required, Validators.minLength(15)])],
      validate: ''
    });
  }

  sendMessage(post) {

    this.name = post.name;
    this.email = post.email;
    this.message = post.message;

    const item: Item = {
      name: post.name,
      email: post.email,
      message: post.message,
      html: `You were contacted from your website by ${post.name}. They said "${post.message}". You can contact them back on ${post.email}`,
      date: Date()
    };

    this.itemRef.update(item);
  }
}

person Samuel Gregory    schedule 02.12.2017    source источник
comment
Разместите код, который записывает в /messages   -  person Bob Snyder    schedule 02.12.2017
comment
Хотя теоретически возможно, что функция запускается несколько раз, я этого не видел. Как просил Боб, обновите свой вопрос, включив в него код, запускающий функцию. Также: если действительно функция запускается несколько раз, она также должна срабатывать, если вы не используете nodemailer, а, например, только оператор console.log в теле. Это значительно упростило бы проблему, поскольку мы можем перестать рассматривать электронную почту как потенциальную причину. Прочтите создание MCVE, чтобы узнать больше о таких вещах.   -  person Frank van Puffelen    schedule 02.12.2017


Ответы (1)


Я сомневаюсь, что кто-то такой тупой, как я, но я писал в то же место в моей БД. Когда-либо существовала только одна запись, поэтому я «менял» 4 элемента данных, поэтому я инициировал 4 события onWrite.

Я решил это, создав новую запись в базе данных в уникальной папке.

person Samuel Gregory    schedule 22.12.2017