Облачная функция Firestore - отправка электронной почты при создании с использованием SendGrid - PullRequest
0 голосов
/ 18 марта 2019

У меня есть контактная форма, которая отправляет данные в базу данных Firestore.Мое намерение состоит в том, чтобы, как только появилась другая запись в коллекции requests, Firestore запустил функцию через Cloud Function, которая содержит конфигурацию для SendGrid, которая снова должна отправлять данные этой конкретной записи в электронную почту.почта.

Я также пытался развернуть эту функцию, которая была успешной, но консоль показывает следующие ошибки, которые, я считаю, не единственные:

Не удается прочитатьсвойство 'requestId' не определено

const functions = require('firebase-functions');

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

const SENDGRID_API_KEY = functions.config().sendgrid.key;

const sgMail = require('@sendgrid/mail');
sgMail.setApiKey(SENDGRID_API_KEY);

exports.firestoreEmail = functions.firestore
  .document('requests/{requestId}')
  .onCreate(event => {

    const requestId = event.params.requestId;

    const db = admin.firestore();

    return db.collection('requests').doc(requestId)
      .get()
      .then(doc => {

        const requestId = event.params.requestId;

        const request = doc.data();

        const msg = {
          to: 'fuh@gmx.net',
          from: 'hello@angularfirebase.com',

          templateId: 'd-',
          substitutionWrappers: ['{{', '}}'],
          substitutions: {
            name: request.name,
            lastname: request.lastname,
            email: request.email,
            package: request.package,
            date: request.date,
            text: request.text
            // and other custom properties here
          }
        };

        return sgMail.send(msg)
      })
      .then(() => console.log('email sent!') )
      .catch(err => console.log(err) )


  });

Редактировать:

const functions = require('firebase-functions');

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

const SENDGRID_API_KEY = functions.config().sendgrid.key;

const sgMail = require('@sendgrid/mail');
sgMail.setApiKey(SENDGRID_API_KEY);

exports.request = functions.firestore
  .document('requests/{requestId}')
  .onCreate((snap, context) => {

    const db = admin.firestore();

    return db.collection('requests').doc(requestId)
      .get()
      .then(doc => {

        const requestId = snap.id;

        const request = doc.data();

        const msg = {
          to: 'fuhr@gmx.net',
          from: 'hello@angularfirebase.com',

          templateId: 'd-3cd6b40ad6674f33702107d2',
          substitutionWrappers: ['{{', '}}'],
          substitutions: {
            name: request.name,
            lastname: request.lastname,
            email: request.email,
            package: request.package,
            date: request.date,
            text: request.text
            // and other custom properties here
          }
        };

        return sgMail.send(msg)
      })
      .then(() => console.log('email sent!') )
      .catch(err => console.log(err) )


  });

1 Ответ

1 голос
/ 18 марта 2019

Метод .onCreate() не возвращает event, он возвращает снимок объекта, и из него вы получаете идентификатор нового объекта.

Так что в вашем случае это должно быть:

exports.firestoreEmail = functions.firestore.document('requests/{requestId}')
  .onCreate((snap, context) => {

    const requestId = snap.id; // get the id
    const db = admin.firestore();

    return db.collection('requests').doc(requestId)
        .get()
        .then(doc => {
           const request = doc.data();
           const msg = {
             to: 'fuhr@gmx.net',
             from: 'hello@angularfirebase.com',

             templateId: 'd-3cd6b40ad6674f33702107d2',
             substitutionWrappers: ['{{', '}}'],
             substitutions: {
                 name: request.name,
                 lastname: request.lastname,
                 email: request.email,
                 package: request.package,
                 date: request.date,
                 text: request.text
                 // and other custom properties here
             }
         };

         return sgMail.send(msg)
     })
     .then(() => console.log('email sent!') )
     .catch(err => console.log(err) )
  });
...