जैसा कि टिप्पणियों में कहा गया है, यह बेहतर है इन कॉलों को मानक स्थिर फ़ाइल अनुरोधों की तरह दिखने के लिए आपके आवेदन में एक अलग एंडपॉइंट रखने के लिए। तो पहली बात मैं क्या यह आपकी स्कीमा को थोड़ा बदल देगा:
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
}
तो यह दो फ़ील्ड जोड़ता है जो छवि के मिलान के लिए "पथ" की पहचान करने जा रहे हैं, और "माइम" फ़ाइल के माइम-प्रकार के रूप में। तो "पथ" एक _id
. की तुलना में अधिक "दोस्ताना" पहचानकर्ता है और "माइम-प्रकार" लौटाई गई सामग्री प्रकार से मेल खाने के लिए डालने में सेट किया जाएगा।
फिर आप सामग्री परोसने के लिए एक मार्ग निर्धारित करते हैं:
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 );
});
})
तो जब आपने ऐसा अनुरोध किया:
ऐसा होगा:
-
"test.png" के लिए "पथ" से मेल खाने वाला दस्तावेज़ ढूंढें
-
प्रतिक्रिया के लिए सामग्री-प्रकार के रूप में "Picture.mime" के लिए दस्तावेज़ गुण असाइन करें
-
प्रतिक्रिया के रूप में बाइनरी डेटा वापस भेजें
तो क्लाइंट के लिए, यह प्रतिक्रिया के रूप में एक वास्तविक फ़ाइल है, और मुद्दा यह है कि "ब्राउज़र" कैश कर सकता है यह और हिट नहीं आपका आवेदन जहां "कैश्ड" कॉपी मान्य है।
यदि आप JSON प्रतिक्रियाओं में बेस 64 एन्कोडेड डेटा एम्बेड कर रहे हैं तो आप ढीले वह महत्वपूर्ण हिस्सा और आप हर बार डेटा भेजते हैं। जैसा कि आपने पाया है, इसे संभालना भी एक बहुत ही गड़बड़ प्रक्रिया है।