Así que tengo una serie de direcciones URL que quiero alojar en mi backend. No pude encontrar nada relacionado con el alojamiento de imágenes con sus URL en Express, así que pensé en una idea. Obtendría el búfer de la imagen con axios y lo enviaría
const images = [ { name: "cow", url: "https://somewhere.com/cow.png" }, { name: "chicken", url: "https://somewhere.com/chicken.png" } ] const express = require("express") const app = express() const port = 4000 const axios = require("axios") app.listen(port, () => { console.log("Online") }) images.forEach(image => { app.get(`/${image.name}.png`, (res, req) => { const getBuffer = async (url) => { return new Promise(async (resolve, reject) => { try { const response = await axios({ method: 'GET', url: url, responseType: 'stream', }); const buffer = response.data resolve(buffer) } catch (err) { console.log(err); } }) } res.sendFile(getBuffer(res.url)) }) })Pero creo que hay una mejor manera de hacer esto.
Cuando usas responseType como stream , puedes reenviar el flujo de datos para expresar el objeto de respuesta directamente:
const express = require("express") const axios = require("axios") const app = express() const port = 4000 const images = [ { name: "cow", url: "https://somewhere.com/cow.png" }, { name: "chicken", url: "https://somewhere.com/chicken.png" } ] app.get('/images/:name', async (req, res) => { const { name } = req.params const image = images.find(img => img.name === name); if (!image) { return res.status(404).send() } try { const response = await axios({ method: 'GET', url: image.url, responseType: 'stream', }); response.data.pipe(res) } catch(error) { res.status(500).send(error.message) } }); app.listen(port, () => { console.log("Online") }) Ahora puedes probar con http://localhost:4000/images/cow