Вопрос или проблема
Я хочу использовать функции 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
. Для этого необходимо убедиться, что вы используете корректный импорт и синтаксис. Давайте рассмотрим исправленный код.
Шаги по реализации
-
Убедитесь, что зависимости установлены правильно: Убедитесь, что у вас установлены последние версии
firebase-functions
,firebase-admin
иnodemailer
. Вы можете установить или обновить их с помощью следующей команды:npm install firebase-functions firebase-admin nodemailer
-
Настройте ваш 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); } });
-
Проверка конфигурации: Убедитесь, что вы настроили переменные окружения, содержащие ваш email и пароль для Gmail:
firebase functions:config:set gmail.email="your-email@gmail.com" gmail.password="your-email-password"
-
Деплой вашего проекта: Используйте команду для развертывания функций Firebase:
firebase deploy --only functions
Заметки
- Права доступа: Убедитесь, что у службы Firebase есть доступ к Firestore, и разрешите отправку писем из вашего приложения Gmail. Вам может понадобиться включить «Доступ менее безопасных приложений» или получить токен доступа для аутентификации.
- Отладка: Включите отладочный вывод в функции, чтобы получать больше информации о возможных ошибках во время выполнения.
- Безопасность: Никогда не храните пароли в коде напрямую. Используйте настройки окружения Firebase.
Заключение
После внесения этих изменений ваш код должен корректно обрабатывать события создания документа в Firestore и отправлять электронные письма при поступлении новых ответов из контактной формы. Если у вас возникнут дополнительные вопросы или проблемы, не стесняйтесь задавать их, и я постараюсь помочь вам их решить.