Như đã nêu trong các nhận xét, nó tốt hơn để có một điểm cuối riêng biệt trong ứng dụng của bạn để thực hiện các lệnh gọi này "trông giống như" các yêu cầu tệp tĩnh tiêu chuẩn. Vì vậy, điều đầu tiên I sẽ làm là thay đổi giản đồ của bạn một chút:
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
}
Vì vậy, điều đó thêm hai trường sẽ xác định "đường dẫn" đến hình ảnh để khớp và "mime" là loại kịch bản của tệp. Vì vậy, "đường dẫn" là một số nhận dạng "thân thiện" hơn một _id
và "mime-type" sẽ được đặt trong phần chèn để khớp với loại nội dung được trả về.
Sau đó, bạn thiết lập một tuyến đường để phân phát nội dung:
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 );
});
})
Vì vậy, khi bạn thực hiện một yêu cầu như:
Điều này sẽ xảy ra:
-
Tìm "đường dẫn" đối sánh tài liệu cho "test.png"
-
Gán thuộc tính tài liệu cho "picture.mime" làm Loại nội dung cho phản hồi
-
Gửi lại dữ liệu nhị phân dưới dạng phản hồi
Vì vậy, đối với ứng dụng khách, đó là một tệp thực tế làm phản hồi và điểm mấu chốt là "trình duyệt" có thể lưu vào bộ nhớ cache cái này và không trúng ứng dụng của bạn có bản sao "được lưu trong bộ nhớ cache" là hợp lệ.
Nếu bạn đang nhúng dữ liệu được mã hóa Base64 trong các phản hồi JSON thì bạn không thích hợp phần quan trọng đó và bạn gửi dữ liệu mọi lúc. Đó cũng là một quá trình rất lộn xộn để xử lý, như bạn đã phát hiện ra.