Както се казва в коментарите, той епо-добър да имате отделна крайна точка във вашето приложение, за да направите тези повиквания да "изглеждат като" стандартни заявки за статичен файл. Така че първото низ бихте направили, е да промените малко вашата схема:
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
}
Това добавя две полета, които ще идентифицират "пътя" към изображението, за да съответства, и "mime" като mime-тип на файла. Така че „path“ е по-„приятелски“ идентификатор от _id
и "mime-type" ще бъде зададен във вмъкването, за да съответства на върнатия тип съдържание.
След това настройвате маршрут за обслужване на съдържанието:
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 );
});
})
Така че, когато направите заявка като:
Това ще се случи:
-
Намерете документа, съответстващ на „path“ за „test.png“
-
Задайте свойството на документа за "picture.mime" като Content-Type за отговор
-
Изпратете обратно двоичните данни като отговор
Така че за клиента това е действителен файл като отговор и въпросът е, че „браузърът“ може да кешира това ине е ударено вашето приложение, където „кешираното“ копие е валидно.
Ако вграждате Base64 кодирани данни в JSON отговори, тогава губите тази важна част и изпращате данните всеки път. Освен това е много объркващ процес, както разбрахте.