Zoals vermeld in de opmerkingen, is het beter om een apart eindpunt in uw toepassing te hebben om deze aanroepen te laten lijken op standaard statische bestandsverzoeken. Dus het eerste wat ik zou doen is je schema een beetje veranderen:
picture: {
metadata: {
name: { type: String, default: null },
comment: { type: String, default: null },
publisherID: { type: String,default: null },
date: { type: Date, default: Date.now },
size: { type: Number,default: 0 },
type: { type: String, default: null }
},
path: { type: String, required: true },
mime: { type: String, required: true },
data: { type: Buffer, default: null },
tags: Array
}
Dus dat voegt twee velden toe die het "pad" naar de te matchen afbeelding gaan identificeren, en "mime" als het mime-type van het bestand. Dus "pad" is een meer "vriendelijke" identifier dan een _id
en het "mime-type" zou in insert worden ingesteld om overeen te komen met het geretourneerde inhoudstype.
Vervolgens stel je een route in om de inhoud te dienen:
app.get('/images/:imgname', function(req,res) {
Picture.find({ "picture.path": req.param("imgname") }, function(err,pic) {
if (err) // checking here
// Sending response
res.set('Content-Type', pic.mime);
res.send( pic[0].picture.data );
});
})
Dus toen je een verzoek deed zoals:
Dit zou gebeuren:
-
Zoek het document dat overeenkomt met "pad" voor "test.png"
-
Wijs de documenteigenschap voor "picture.mime" toe als het inhoudstype voor het antwoord
-
Stuur de binaire gegevens terug als antwoord
Dus voor de klant is het een echt bestand als antwoord, en het punt is dat de "browser" kan cache dit en niet geraakt uw applicatie waar de kopie in de cache geldig is.
Als u Base64-gecodeerde gegevens insluit in JSON-reacties, dan verliest u verlies dat belangrijke onderdeel en u verzendt de gegevens elke keer. Het is ook een erg rommelig proces om mee om te gaan, zoals je hebt ontdekt.