Функции Firebase/Nodemailer отправка письма себе, когда форма отправлена.

Вопрос или проблема

Я хочу использовать функции Firebase вместе с Nodemailer, чтобы получать электронные письма, когда отправляется контактная форма. Форма сохраняется в моей базе данных, а затем я хочу использовать ее в своем файле index.js с функцией, которая срабатывает, когда регистрируется новая запись. Следующий код – это то, что у меня есть, и похоже, что функции.firestore.document не рассматривается как функция.

const functions = require("firebase-functions");
const admin = require("firebase-admin");
const nodemailer = require("nodemailer");

admin.initializeApp();

const gmailEmail = functions.config().gmail.email;
const gmailPassword = functions.config().gmail.password;

const transporter = nodemailer.createTransport({
  service: "gmail",
  auth: {
    user: gmailEmail,
    pass: gmailPassword,
  },
});

const contactFormPath = "contactSubmissions/{docId}";

exports.sendContactEmail = functions.firestore
.document(contactFormPath)
  .onCreate(async (snap) => {
    const data = snap.data();

    const mailOptions = {
      from: gmailEmail,
      to: gmailEmail,
      subject: `Новое сообщение с контактной формы: ${data.subject}`,
      text: `
        У вас новое сообщение с контактной формы!

        Имя: ${data.firstName} ${data.lastName}
        Электронная почта: ${data.email}
        Тема: ${data.subject}
        Сообщение: ${data.message}
      `,
    };

    try {
      await transporter.sendMail(mailOptions);
      console.log("Email отправлено успешно");
    } catch (error) {
      console.error("Ошибка при отправке email:", error);
    }
  });

=== Развертывание в 'imidea-940fa'...

i  развертывание функций
i  функции: подготовка кода для развертывания функций
i  функции: проверка, что необходимый API cloudfunctions.googleapis.com включен...
i  функции: проверка, что необходимый API cloudbuild.googleapis.com включен...
i  artifactregistry: проверка, что необходимый API artifactregistry.googleapis.com включен...
+  artifactregistry: необходимый API artifactregistry.googleapis.com включен
+  функции: необходимый API cloudfunctions.googleapis.com включен
+  функции: необходимый API cloudbuild.googleapis.com включен
i  функции: загрузка и анализ исходного кода для базового кода функций, чтобы определить, что развернуть
Обслуживание на порту 8795

TypeError: функции.firestore.document не является функцией
    at Object.<anonymous> (E:\WEBSITES\imidea\emails\index.js:22:2)
    at Module._compile (node:internal/modules/cjs/loader:1376:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1435:10)
    at Module.load (node:internal/modules/cjs/loader:1207:32)
    at Module._load (node:internal/modules/cjs/loader:1023:12)
    at Module.require (node:internal/modules/cjs/loader:1235:19)
    at require (node:internal/modules/helpers:176:18)
    at loadModule (E:\WEBSITES\imidea\emails\node_modules\firebase-functions\lib\runtime\loader.js:40:16)
    at loadStack (E:\WEBSITES\imidea\emails\node_modules\firebase-functions\lib\runtime\loader.js:157:23)
    at E:\WEBSITES\imidea\emails\node_modules\firebase-functions\lib\bin\firebase-functions.js:56:56    

Ошибка: Базу кода функций не удалось успешно проанализировать. Возможно, в ней есть синтаксическая или ошибка выполнения

Честно говоря, я пробовал слишком много различных вещей, чтобы запомнить. Устанавливал, переустанавливал разные зависимости и т. д. Пытался перезаписать код так, чтобы это не была функция, однако, когда я это пытался, у меня не получалось заставить это работать.

Ответ или решение

Чтобы реализовать отправку электронных писем при отправке формы с использованием Firebase Functions и Nodemailer, необходимо корректно настроить триггер для Firestore и устранить ошибки в коде. Давайте разберем ваш сценарий и предоставим рабочее решение.

Проблема

Ваш код выдает ошибку TypeError: functions.firestore.document is not a function, что указывает на неправильное использование функции вызова триггера Firestore. Эта ошибка возникает из-за отсутствия метода document в объекте functions.firestore.

Решение

Вместо functions.firestore.document, нужно использовать functions.firestore.document. Для этого необходимо убедиться, что вы используете корректный импорт и синтаксис. Давайте рассмотрим исправленный код.

Шаги по реализации

  1. Убедитесь, что зависимости установлены правильно: Убедитесь, что у вас установлены последние версии firebase-functions, firebase-admin и nodemailer. Вы можете установить или обновить их с помощью следующей команды:

    npm install firebase-functions firebase-admin nodemailer
  2. Настройте ваш Firebase Functions код: Обновите ваш код следующим образом:

    const functions = require("firebase-functions");
    const admin = require("firebase-admin");
    const nodemailer = require("nodemailer");
    
    admin.initializeApp();
    
    const gmailEmail = functions.config().gmail.email;
    const gmailPassword = functions.config().gmail.password;
    
    const transporter = nodemailer.createTransport({
     service: "gmail",
     auth: {
       user: gmailEmail,
       pass: gmailPassword,
     },
    });
    
    const contactFormPath = "contactSubmissions/{docId}";
    
    exports.sendContactEmail = functions.firestore
     .document(contactFormPath)
     .onCreate(async (snap) => {
       const data = snap.data();
    
       const mailOptions = {
         from: gmailEmail,
         to: gmailEmail,
         subject: `Новое сообщение через контактную форму: ${data.subject}`,
         text: `
           У вас новое сообщение через контактную форму!
    
           Имя: ${data.firstName} ${data.lastName}
           Электронная почта: ${data.email}
           Тема: ${data.subject}
           Сообщение: ${data.message}
         `,
       };
    
       try {
         await transporter.sendMail(mailOptions);
         console.log("Email успешно отправлен");
       } catch (error) {
         console.error("Ошибка при отправке email:", error);
       }
     });
  3. Проверка конфигурации: Убедитесь, что вы настроили переменные окружения, содержащие ваш email и пароль для Gmail:

    firebase functions:config:set gmail.email="your-email@gmail.com" gmail.password="your-email-password"
  4. Деплой вашего проекта: Используйте команду для развертывания функций Firebase:

    firebase deploy --only functions

Заметки

  • Права доступа: Убедитесь, что у службы Firebase есть доступ к Firestore, и разрешите отправку писем из вашего приложения Gmail. Вам может понадобиться включить «Доступ менее безопасных приложений» или получить токен доступа для аутентификации.
  • Отладка: Включите отладочный вывод в функции, чтобы получать больше информации о возможных ошибках во время выполнения.
  • Безопасность: Никогда не храните пароли в коде напрямую. Используйте настройки окружения Firebase.

Заключение

После внесения этих изменений ваш код должен корректно обрабатывать события создания документа в Firestore и отправлять электронные письма при поступлении новых ответов из контактной формы. Если у вас возникнут дополнительные вопросы или проблемы, не стесняйтесь задавать их, и я постараюсь помочь вам их решить.

Оцените материал
Добавить комментарий

Капча загружается...