Quiero separar los controladores y los servicios en mi aplicación Express, actualmente tengo un servicio que genera un archivo XLSX usando ExcelJS, quiero reutilizar el servicio, así que no quiero pasar el objeto de respuesta al servicio, ¿está ahí? una forma en que puedo devolver el archivo del servicio al controlador?
Ahora mismo tengo lo siguiente
const generateXLSX = (res, data) => { let baseFile = "path/to/template.xlsx"; let wb = new Excel.Workbook(); wb.xlsx .readFile(baseFile) .then(async () => { // add data to template } await wb.xlsx.write(res); res.end(); }) .catch((err) => { console.log(err); res.status(500); }); };En esta función, estoy usando el objeto de respuesta en el servicio, quiero saber si hay una forma de devolver el archivo sin usar write(res) y enviarlo al controlador.
Su función generateXLSX podría devolver una secuencia legible de "paso" que luego canaliza al objeto res . Algo como
const {PassThrough} = require("stream"); function generateXLSX(data) { let baseFile = "path/to/template.xlsx"; let wb = new Excel.Workbook(); let readable = new PassThrough(); wb.xlsx .readFile(baseFile) .then(async function() { // add data to template await wb.xlsx.write(readable); readable.end(); }) .catch((err) => { readable.destroy(err); }); return readable; } app.use("/path", function(req, res) { generateXLSX(req.query.data).pipe(res); });