Jak stwierdzono w komentarzach, jest lepiej mieć osobny punkt końcowy w aplikacji, aby te wywołania „wyglądały jak” standardowe żądania plików statycznych. Więc pierwsza rzecz ja wystarczy trochę zmienić schemat:
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
}
Dodaje to dwa pola, które będą identyfikować "ścieżkę" do obrazu do dopasowania oraz "mime" jako typ MIME pliku. Tak więc „ścieżka” jest bardziej „przyjaznym” identyfikatorem niż _id
a „typ MIME” zostanie ustawiony we wstawce, aby pasował do zwróconego typu treści.
Następnie konfigurujesz trasę do obsługi treści:
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 );
});
})
Więc kiedy zrobiłeś prośbę, taką jak:
Tak by się stało:
-
Znajdź dokument pasujący do „ścieżki” dla „test.png”
-
Przypisz właściwość dokumentu dla „picture.mime” jako Content-Type odpowiedzi
-
Odeślij dane binarne jako odpowiedź
Tak więc dla klienta jest to rzeczywisty plik jako odpowiedź, a chodzi o to, że „przeglądarka” może buforować to i nie trafić Twoja aplikacja, w której kopia „z pamięci podręcznej” jest ważna.
Jeśli osadzasz dane zakodowane w Base64 w odpowiedziach JSON, przegrywasz tę ważną część i za każdym razem wysyłasz dane. Jak już odkryłeś, jest to również bardzo kłopotliwy proces.