Wie in den Kommentaren angegeben, ist es besser um einen separaten Endpunkt in Ihrer Anwendung zu haben, damit diese Aufrufe wie Standardanforderungen für statische Dateien aussehen. Also das erste, was ich würde tun, ist Ihr Schema ein wenig zu ändern:
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
}
Das fügt also zwei Felder hinzu, die den "Pfad" zu dem Bild identifizieren, das abgeglichen werden soll, und "mime" als Mime-Typ der Datei. „Pfad“ ist also ein „freundlicherer“ Bezeichner als eine _id
und der "mime-type" würde in insert gesetzt, um mit dem zurückgegebenen Inhaltstyp übereinzustimmen.
Dann richten Sie eine Route ein, um den Inhalt bereitzustellen:
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 );
});
})
Wenn Sie also eine Anfrage wie die folgende gestellt haben:
Dies würde passieren:
-
Finden Sie den passenden „Pfad“ des Dokuments für „test.png“
-
Weisen Sie als Content-Type für die Antwort die Dokumenteigenschaft für "picture.mime" zu
-
Senden Sie die Binärdaten als Antwort zurück
Für den Client ist es also eine tatsächliche Datei als Antwort, und der Punkt ist, dass der "Browser" zwischenspeichern kann dies und nicht getroffen Ihrer Anwendung, wo die "zwischengespeicherte" Kopie gültig ist.
Wenn Sie Base64-codierte Daten in JSON-Antworten einbetten, dann verlieren Sie dieser wichtige Teil und Sie senden die Daten jedes Mal. Es ist auch ein sehr unordentlicher Prozess, wie Sie festgestellt haben.