Когда пользователь выбирает большой диапазон дат (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>
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>
Подробнее здесь: https://stackoverflow.com/questions/797 ... xceljs-and
Мобильная версия