Создайте вложение CSV Mail для каждого объекта в массиве - PullRequest
0 голосов
/ 10 июля 2020

В моем проекте у меня есть массив объектов, который отправляется функции для создания CSV-файла из этого массива объектов.

Этот CSV-файл настроен на то, чтобы содержать каждый из объектов из массива в одном файле, а затем используется как вложение в параметрах почты.

Теперь моя цель - создать вложение CSV из каждого объекта в массиве, а не только из одного файла, включающего все объекты.

Мой массив объектов выглядит так

let products = [{product: 'product-184', id: 184, description: 'description for product-184'}, {product: 'product-192', id: 192, description: 'description for product-192'}, {product: 'product-122', id: 122, description: 'description for product-122'}]

Это функция, которая отправляет массив в функцию generateCSVText (), а затем добавляет его к прикрепленным файлам.

index.sendMail = (data) => {
    
            //filter out empty products
            const products = data.filter(item => {
                return item.product !== null
            });
    
            let emailOptions = {},
                csvText = generateCSVText(products); 
                //this function is being used to generate the text for the CSV file, it currently sends the entire array as a parameter, which is not the goal anymore
    
            try {
                emailOptions = {
                    // adds attachments
                    attachments: [
                    // the goal is to create a CSV attachement from every object in the array of objects
                        {
                            filename: `${moment().format('YYYYMMDDHHmmss')}.csv`,
                            content: csvText
                        },
                    ],
                    subject: subject,
                    from: sendMailFrom,
                    text:
                        'attachements for products',
                    to: sendMailTo
                };
    
            } catch (e) {
                return Promise.reject(e);
            }
    
            return send(emailOptions); //send mail
        };
    }

Это - это функция generateCSVText, я не уверен, насколько она актуальна для решения, но я все равно решил поделиться ею

const _ = require('lodash');

module.exports = data => {
    let header = '';
    let rows = [];
    let inletsCount = 0;
    let uselessHeader = false;

    if (!_.isArray(data)) {
        data = [data];
    }
    data.forEach(configuration => {
        uselessHeader = true;
        let tmpHeader = _.flatten(_.map(configuration, (value, key) => {
            if (_.isArray(value)) {
                return _.map(value, (_, index) => {
                    return key + ' ' + (index + 1)
                })
            }

            return key;
        })).join(';');
        if (!uselessHeader) {
            header = tmpHeader;
        }


        rows.push(
            _.flatten(_.map(configuration, value => {
                if (_.isArray(value)) {
                    return _.map(value, element => {
                        return _.map(element, (v, k) => {
                            return k + ':' + v
                        }).join(' ,');
                    })
                }

                return value;
            })).join(';')
        );
    });

    return [header, rows.join('\n')].join('\n');
};

Окончательный вывод CSV выглядит так: введите описание изображения здесь

Итак, как я могу вернуть одно вложение для каждого объекта, как вы порекомендуете подходить к этому? Я благодарен за любой вклад!

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