使用图像url托管express中的图像



所以我有一个url数组,我想在后台托管它。我找不到任何与使用express中的url托管图像相关的内容,所以我想到了一个主意。我会用axios获取图像的缓冲区并发送

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))
})
})

但我认为有更好的方法来完成

当您使用responseType作为stream时,您可以直接转发数据流来表示响应对象:

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") })

现在您可以试用http://localhost:4000/images/cow

最新更新