Создавайте и отправляйте по электронной почте pdf в облачных функциях с помощью Node.js и облачного хранилища Firebase - PullRequest
0 голосов
/ 07 января 2020

У меня есть следующий код в облачных функциях, который срабатывает всякий раз, когда пользователь делает заказ. Затем я хочу сгенерировать счет в формате PDF с использованием хранилища Firebase, а затем отправить PDF пользователю по электронной почте. У меня трудное время, чтобы получить PDF-файл, так как я не уверен, как именно я должен это делать. Письмо отправляется пользователю без проблем после размещения заказа. Я знаю, как сделать вложение в почтовых сообщениях ниже, но я не могу понять, как создать PDF и вставить информацию о продукте.

// Triggers once the user place an order
exports.notifyUserOfOrderConfirmation = functions.firestore.document('masterOrders/{masterOrderId}').onCreate((snap, context) => {

    const data = snap.data();
    const orderedUserEmail = data.userEmail;
    const customerOrderId = data.customerOrderId;
    const userId = data.userId;
    const masterOrderId = context.params.masterOrderId;

    return orderProductsQuery(data, masterOrderId, orderedUserEmail, customerOrderId, userId)

});

// Query the firestore to get the ordered products
function orderProductsQuery(data, masterOrderId, orderedUserEmail, customerOrderId, userId) {

    return db.collection('users').doc(userId).collection('orders').doc(customerOrderId).collection('orderCart').get().then(snap => {
        const orderedProducts = [];
        snap.forEach(doc => {
            const productData = doc.data();
            orderedProducts.push(productData);
        })

        // return notifyUserOfOrderConfirmation(data, masterOrderId, orderedUserEmail, customerOrderId, orderedProducts)
        return generatePDF(data, masterOrderId, orderedUserEmail, customerOrderId, orderedProducts)

    }).catch((err) => {
        console.log('Error getting documents', err);
        return Promise.reject(err);
    })
}

Здесь мне нужна помощь; код ниже - это то, что я написал до сих пор:

const pdfkit = require("pdfkit");
const Storage  = require('@google-cloud/storage');

// Creates a client
const storage = new Storage ({projectId: MYPROJECTID});

// Lists all buckets in the current project
const buckets = storage.getBuckets();

function generatePDF(data, masterOrderId, orderedUserEmail, customerOrderId, orderedProducts) {
    const doc = new pdfkit();
    const filename = `/${customerOrderId}/test-` + Date.now() + '.pdf'; 
    const bucket = storage.bucket(MYBUCKETNAME)    
    const file = bucket.file(filename);
    const bucketFileStream = file.createWriteStream();

    doc.pipe(bucketFileStream);

    doc.end();

    bucketFileStream.on('finish', function () {
        return notifyUserOfOrderConfirmation(filename, data, masterOrderId, orderedUserEmail, customerOrderId, orderedProducts)
    });

    bucketFileStream.on("error", function (err) {
        console.error(err);
    });
}

А вот когда я отправляю электронное письмо; Я знаю, что приведенный ниже код прекрасно работает без PDF-кодов, поэтому нет проблем с отправкой электронной почты без PDF:

async function notifyUserOfOrderConfirmation(filename, data, masterOrderId, orderedUserEmail, customerOrderId, orderedProducts) {

    const bucket = storage.bucket(MYBUCKETNAME);
    const file = bucket.file(filename);    

    const mailOptions = {

        from: `${APP_NAME} <MYEMAIL>`,
        to: orderedUserEmail
    };

    mailOptions.subject = `Order Confirmation`;
    mailOptions.text = `We received your order. attached is your invoice`;

    mailOptions.attachments = [{
        filename: "test.pdf",
        content: file.createReadStream()
    }];

    await transporter.sendMail(mailOptions);
    console.log('New welcome email sent to:', orderedUserEmail);
    return null;
}

Когда я разверну это; Я не получаю ошибки в моем развертывании. Но когда я размещаю заказ в приложении; Я получаю следующую ошибку в функциях Firebase:

Error: socket hang up
    at TLSSocket.onHangUp (_tls_wrap.js:1148:19)
    at Object.onceWrapper (events.js:313:30)
    at emitNone (events.js:111:20)
    at TLSSocket.emit (events.js:208:7)
    at endReadableNT (_stream_readable.js:1064:12)
    at _combinedTickCallback (internal/process/next_tick.js:139:11)
    at process._tickDomainCallback (internal/process/next_tick.js:219:9)

Unhandled rejection

Есть идеи, в чем здесь проблема, и я, как я могу правильно генерировать PDF в этом сценарии?

1 Ответ

1 голос
/ 10 января 2020

Разобрался. Приведенный выше код на самом деле правильный, и у меня просто неправильное имя файла здесь const file = bucket.file(filename);, так что с этим кодом проблем нет, и он работает как прелесть для тех, кто хочет использовать его для создания PDF и электронной почты для пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...