502 Тайм-аут шлюза При генерации больших отчетов Excel (60 МБ+) с Exceljs и AWS-работает в течение 1 месяца, сбой в течеJavascript

Форум по Javascript
Ответить
Anonymous
 502 Тайм-аут шлюза При генерации больших отчетов Excel (60 МБ+) с Exceljs и AWS-работает в течение 1 месяца, сбой в тече

Сообщение Anonymous »

Я работаю над node.js + Express Backend, где мне нужно генерировать и загружать отчеты Excel из MongoDB, используя Exceljs.
Когда пользователь выбирает большой диапазон дат (2-3 месяца)-около 60 МБ данных Excel-Server Times Out с диапазоном 502 шлюза на AWS. /> Что я попробовал: < /p>
Первоначально мой код сгенерировал один файл Excel для всего диапазона: < /p>
downloadReportsExcel: async (req, res) => {
try {
req.setTimeout(0);
const { from, to } = req.query;
const fromDate = new Date(from);
const toDate = new Date(to);

const reports = await Report.find({
createdAt: { $gte: fromDate, $lte: toDate },
}).populate("case reportedBy");

const workbook = new ExcelJS.stream.xlsx.WorkbookWriter({ stream: res });
const worksheet = workbook.addWorksheet("Reports");

worksheet.columns = [
{ header: "CONTRACTOR NAME", key: "contractorName", width: 25 },
// ...other columns
];

res.setHeader(
"Content-Disposition",
`attachment; filename="Reports_${from}_to_${to}.xlsx"`
);

for (const report of reports) {
worksheet.addRow({
"CONTRACTOR NAME": report.contractorName || "N/A",
// ...
}).commit();
}
worksheet.commit();
await workbook.commit();
} catch (err) {
console.error(err);
}
};
< /code>
✅ Это работало для меньших диапазонов дат (1 месяц),
❌, но не удалось для больших диапазонов (2–3 месяца, ~ 60 МБ файл) с временными ожиданиями 502 шлюза через 2–3 минуты (AWS по умолчанию) Диапазон в ежемесячные куски, генерируя отдельные файлы Excel для каждого месяца, а затем нарастать их вместе: < /p>
const chunks = getMonthlyChunks(fromDate, toDate);
const zip = new JSZip();

for (const chunk of chunks) {
const reports = await Report.find({
createdAt: { $gte: chunk.start, $lte: chunk.end },
});

const workbook = new ExcelJS.Workbook();
const worksheet = workbook.addWorksheet("Reports");

worksheet.columns = [...];

for (const report of reports) {
worksheet.addRow({...});
}

const buffer = await workbook.xlsx.writeBuffer();
const chunkName = `Reports_${chunk.start.toISOString()}_${chunk.end.toISOString()}.xlsx`;
zip.file(chunkName, buffer);
}

const zipBuffer = await zip.generateAsync({ type: "nodebuffer" });
res.setHeader("Content-Type", "application/zip");
res.setHeader("Content-Disposition", `attachment; filename="Reports.zip"`);
res.send(zipBuffer);
< /code>
✅ работает локально для 1-месячных данных,
❌ до сих пор в течение 2–3 месяцев на AWS (файл ~ 60 МБ, 2–3 мин. Обработка). < /p>

Подробнее здесь: https://stackoverflow.com/questions/797 ... xceljs-and
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»