2012-09-14 13 views
5

मेरे पास मोंगोडीबी और जेड टेम्पलेट भाषा का उपयोग करते हुए नोडजेएस 0.8.8 पर एक एक्सप्रेसज ऐप चल रहा है, और मैं उपयोगकर्ता को साइट के विस्तृत प्रस्तुति विकल्पों जैसे पेज शीर्षक, लोगो छवि इत्यादि को कॉन्फ़िगर करने की अनुमति देना चाहता हूं।मैं मोंडो डीबी में साइट कॉन्फ़िगरेशन को नोडजेएस एक्सप्रेस ऐप के लिए कैसे स्टोर कर सकता हूं?

मैं इन कॉन्फ़िगरेशन विकल्पों को एक mongoDB डेटाबेस में कैसे संग्रहीत कर सकता हूं ताकि मैं उन्हें एप्लिकेशन स्टार्टअप पर पढ़ सकूं, ऐप चल रहा हो, और उन्हें जेड टेम्पलेट्स में प्रदर्शित कर सकूं?

यहाँ मेरी सामान्य ऐप सेटअप है:

var app = module.exports = express(); 
global.app = app; 
var DB = require('./accessDB'); 
var conn = 'mongodb://localhost/dbname'; 
var db; 

// App Config 
app.configure(function(){ 
    ... 
}); 

db = new DB.startup(conn); 

//env specific config 
app.configure('development', function(){ 
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
}); // etc 

// use date manipulation tool moment 
app.locals.moment = moment; 

// Load the router 
require('./routes')(app); 

अब तक मैं "siteConfig" संग्रह के लिए एक मॉडल "साइट" कहा जाता है बनाया है और मैं एक समारोह accessDB.js में getSiteConfig कहा जाता है कि Site.find चलाता है() ... संग्रह में एक दस्तावेज़ में फ़ील्ड को पुनर्प्राप्त करने के लिए।

तो यह सवाल का क्रूक्स है: मुझे उन क्षेत्रों को एक्सप्रेस ऐप में कैसे इंजेक्ट करना चाहिए ताकि उन्हें साइट पर उपयोग किया जा सके? क्या मुझे उसी पैटर्न का पालन करना चाहिए जिसका मैंने क्षण.जेएस उपकरण के साथ उपयोग किया था? इस तरह:

db.getSiteConfig(function(err, siteConfig){ 
    if (err) {throw err;} 
    app.locals.siteConfig = siteConfig; 
}); 

यदि नहीं, तो ऐसा करने का सही तरीका क्या होगा?

धन्यवाद!

+0

यह कुछ आप सत्र में संग्रहीत करना चाहते हैं है:

निम्नलिखित कोड एक्सप्रेस sessionn में कैशिंग siteConfig के विचार को दर्शाता है? – c0deNinja

+0

नहीं, मुझे विश्वास नहीं है। मैं नहीं चाहता कि ग्राहक को इसका उपयोग हो। मैं सिर्फ सर्वर-साइड एक्सप्रेस ऐप (जेड विशेष रूप से) तक पहुंच प्राप्त करना चाहता हूं। मैं इसे console.log के बिंदु पर काम कर रहा हूं। मुझे लगता है कि मुझे इसे ऐप.लोकल्स में जोड़ने की कोशिश करनी चाहिए और देखें कि क्या होता है, लेकिन मुझे इसका उपयोग करने के सुरक्षा प्रभावों के बारे में निश्चित नहीं है। (या इसकी स्थिरता) – tutley

उत्तर

16

साइट कॉन्फ़िगरेशन लोड करने के लिए एक्सप्रेस मिडलवेयर का उपयोग करने पर विचार करें।

app.configure(function() { 
    app.use(function(req, res, next) { 
    // feel free to use req to store any user-specific data 
    return db.getSiteConfig(req.user, function(err, siteConfig) { 
     if (err) return next(err); 
     res.local('siteConfig', siteConfig); 
     return next(); 
    }); 
    }); 
    ... 
}); 

त्रुटि को फेंकना एक वास्तविक बुरा विचार है क्योंकि यह आपके आवेदन को क्रैश करेगा। तो इसके बजाय next(err); का उपयोग करें। यह errorHandler व्यक्त करने के लिए आपकी त्रुटि को पारित करेगा।

यदि आपने पहले से ही अपने उपयोगकर्ता को प्रमाणित किया है (उदाहरण के लिए, पिछले मिडलवेयर में) और अपने डेटा को req.user में संग्रहीत किया है, तो आप डीबी से सही कॉन्फ़िगरेशन प्राप्त करने के लिए इसका उपयोग कर सकते हैं।

लेकिन एक्सप्रेस मिडलवेयर के अंदर अपने getSiteConfig फ़ंक्शन का उपयोग करने से सावधान रहें क्योंकि यह डेटा प्राप्त होने तक अनुरोध की आगे की प्रक्रिया से एक्सप्रेस को रोक देगा।

आप एप्लिकेशन को तेज़ करने के लिए एक्सप्रेस सत्र में siteConfig कैशिंग पर विचार करेंगे। एक्सप्रेस सत्र में सत्र-विशिष्ट डेटा संग्रहीत करना बिल्कुल सुरक्षित है क्योंकि उपयोगकर्ता को इसका उपयोग करने का कोई तरीका नहीं है।

app.configure(function() { 
    app.use(express.session({ 
    secret: "your sercret" 
    })); 
    app.use(/* Some middleware that handles authentication */); 
    app.use(function(req, res, next) { 
    if (req.session.siteConfig) { 
     res.local('siteConfig', req.session.siteConfig); 
     return next(); 
    } 
    return db.getSiteConfig(req.user, function(err, siteConfig) { 
     if (err) return next(err); 
     req.session.siteConfig = siteConfig; 
     res.local('siteConfig', siteConfig); 
     return next(); 
    }); 
    }); 
    ... 
}); 
+1

यह एक अच्छा जवाब है और मैं वास्तव में इसकी सराहना करता हूं। दुर्भाग्य से मैं इसे वोट नहीं दे सकता क्योंकि मेरे पास पर्याप्त प्रतिष्ठा नहीं है, लेकिन अगर कोई इसे देख रहा है, तो कृपया इसे वोट दें। एक बार फिर धन्यवाद। – tutley