javascript node.js express gridfs

javascript - Cambiar un búfer de un ReadStream en un archivo real



node.js express (1)

Ok, esto me salvó la vida: https://youtu.be/pXHOF4GWuZQ . Este es el código final:

downloadFile(file_id) { return new Promise((resolve, reject) => { var mongoose = require(''mongoose''); var Grid = require(''gridfs-stream''); var fs = require(''fs''); mongoose.connect(config.db, {useNewUrlParser: true},).catch(e => console.log(e)); var conn = mongoose.connection; Grid.mongo = mongoose.mongo; var gfs = Grid(conn.db); console.log(''downloadfile'', file_id); var read_stream = gfs.createReadStream({_id: file_id}); let file = []; read_stream.on(''data'', function (chunk) { file.push(chunk); }); read_stream.on(''error'', e => { console.log(e); reject(e); }); return read_stream.on(''end'', function () { file = Buffer.concat(file); const img = `data:image/png;base64,${Buffer(file).toString(''base64'')}`; resolve(img); }); }); }

Así que tengo este código:

downloadFile(file_id) { return new Promise((resolve, reject) => { var mongoose = require(''mongoose''); var Grid = require(''gridfs-stream''); var fs = require(''fs''); mongoose.connect(config.db, {useNewUrlParser: true},).catch(e => console.log(e)); var conn = mongoose.connection; Grid.mongo = mongoose.mongo; var gfs = Grid(conn.db); console.log(''downloadfile'', file_id); var read_stream = gfs.createReadStream({_id: file_id}); let file = []; read_stream.on(''data'', function (chunk) { file.push(chunk); }); read_stream.on(''error'', e => { console.log(e); reject(e); }); return read_stream.on(''end'', function () { resolve(file); }); }); }

Y lo estoy llamando así:

Account.findById(req.params._id) .then(async account => { const file = await functions.downloadFile(account.employer.logo); res.render(''users/employer/booth'', { title: ''Employer Booth'', user: req.user, postings: postings, employer: account.employer, event: event, logo: logo, }); });

¿Cómo puedo guardar este archivo en el servidor y servirlo como una imagen, o simplemente enviarlo a la vista y mostrarlo en una etiqueta <img> ?

Intenté hacer algo como esto:

read_stream.on(''open'', function () { var imgFile = fs.createWriteStream(`/public/images/logos/${file_id}.jpg`); var write_stream = read_stream.pipe(imgFile); read_stream.pipe(res); }); read_stream.on(''error'', e => { console.log(e); });

Pero esto no pudo leer el archivo guardado, y el archivo no se guardó en ninguna parte.