В настоящее время я пишу облачную функцию в Firebase для отправки писем с помощью nodemailer, которая включает qr-код.
Если я имитирую проект в эмуляторе Firebase, все работает нормально, и письма отправляются правильно .
Однако, когда я загружаю код в Firebase, функция всегда отключается через 60 секунд. Я уже пытался увеличить время ожидания, но это все еще происходит.
Мой код:
exports.emailSender = functions.https.onRequest(async (req, res) => {
var { name, code, hash, dest } = req.body;
let transporter = nodemailer.createTransport({
host: "smtp.test.com",
port: 25,
auth: {
user: "username",
pass: "password",
},
});
try {
let qr = await create_qrcode(code+":"+hash,250,50);
let qrBig = await create_qrcode(code+":"+hash,500,100);
const mailOptions = {
from: "no-reply@test.de",
to: dest,
subject: "Email Sent via Firebase",
html: `<img src="${qr}" />`,
attachments: [
{
filename: "QR-Code",
path: qrBig,
},
],
};
await transporter.sendMail(mailOptions, (err, info) => {
if (err) {
console.log(err);
res.send({ error: err.message });
} else {
console.log(info);
res.send("Erfolgreich");
}
});
} catch (error) {
res.send({ error: error.message });
}
});
Функция для создания qrcode:
async function create_qrcode(dataForQRcode, width, cwidth {
// grab data you want on qrcode here
const cvs = createCanvas(1, 1);
const url = await QRCode.toCanvas(cvs, dataForQRcode, {
errorCorrectionLevel: "H", // LMQH
margin: 1,
color: {
dark: "#000000", // black pixels
light: "#ffffff", // white background
},
});
const canvas = createCanvas(width, width);
const ctx = canvas.getContext("2d");
const img = await loadImage("./icon.png");
ctx.drawImage(url, 0, 0, width, width);
const center = (width - cwidth) / 2;
ctx.drawImage(img, center, center, cwidth, cwidth);
return canvas.toDataURL("image/png");
};
Похоже, что функция зависает на sendMail()
, поэтому res.send()
не запускается, и через 60 секунд достигается тайм-аут.
Есть идеи, почему это работает на эмуляторе, а не на реальных облачных функциях?