2012-01-06 11 views
5

वर्तमान में मैं ऐसा करके node-mysql के लिए अपने ग्राहक कनेक्शन सेट कर रहा हूं में निम्नलिखित मेरी app.js और एक विशेष config/environment.js:मुझे अपने MySQL क्लाइंट को Node.js (Express) ऐप में कहां परिभाषित करना चाहिए?

var client = mysql.createClient({ 
    user:  'USER', 
    database: 'DATABASE', 
    password: 'PASSWORD', 
    host:  'HOST' 
}); 

app.configure(function(){ 
    ... 
    app.set('client', client); 
    ... 
}); 

तो मेरे मुवक्किल कोड में मैं सिर्फ app.settings.client फोन MySQL ग्राहक का उपयोग करने के लिए।

मुझे यकीन है कि अगर यह सही दृष्टिकोण है नहीं कर रहा हूँ, और यह निश्चित रूप से जब मैं परीक्षण कर रहा हूँ काम नहीं करता है, जैसा कि मैंने एप्लिकेशन का एक चल उदाहरण की जरूरत है।

कोई सुझाव?

+1

'app.settings.client' के बजाय' app.set ('client') 'का उपयोग करें। और इसे परीक्षण के साथ काम करना चाहिए, आपको – Raynos

+0

@ रेयानोस मॉकिंग के हिस्से के रूप में बस अपने यूनिट परीक्षण में खाली 'ऐप' लगाने की आवश्यकता है, आप खाली 'ऐप' कैसे इंजेक्ट करते हैं? –

+0

आपके कोड पर निर्भर करता है। [मैं ऐसा कुछ करता हूं] (https://github.com/Raynos/nCore-example/blob/master/test/routes-home.js) लेकिन मुझे लगता है कि आपका आर्किटेक्चर पूरी तरह से अलग है। – Raynos

उत्तर

2

3 समाधान तरह से मैं इसे देख रहे हैं।
बी) अपने मार्गों को उस फ़ंक्शन में लपेटें जो डेटाबेस को पैरामीटर के रूप में स्वीकार करता है। उदाहरण:

sample_route.js

module.exports = function (db) { 
    return function(req, res, next) { 
    // db is accessible here 
    } 
} 

app.js

var = sample_route = require('./sample_route')(db); 
app.get('/sample', sample_route); 


ग) एक वैश्विक चर है कि हर जगह सुलभ हो जाएगा (हालांकि अनुशंसित नहीं) बनाओ: global.MY_DB = ...;

2

मुझे लगता है कि यह करने के लिए एक और अधिक विशिष्ट तरीका एक सरल मिडलवेयर कि अनुरोध की एक संपत्ति के रूप में mysql ग्राहक सेट को परिभाषित करने के लिए होगा। उदाहरण के लिए:

var client = mysql.createClient({ 
     user:  'USER', 
     database: 'DATABASE', 
     password: 'PASSWORD', 
     host:  'HOST' 
    }) 

app.use(function(req, res, next) { 
    req.mysql = client; 
    next(); 
}); 

फिर अपने मार्ग संचालकों में आप req.mysql पहुँच सकते हैं। आपके परीक्षण मामलों में आपको किसी भी तरह से req.mysql सेट अप करने की आवश्यकता है, यह बहुत आसान होना चाहिए।

क) के रूप में @Raynos टिप्पणी में सुझाव दिया, app.set(key, value); का प्रयोग कर एक डाटाबेस मान सेट करने के लिए और फिर app.set (key) कि मूल्य प्राप्त करने के:

+3

यह भयानक है। आप प्रति अनुरोध एक नया mysql objcet बनाते हैं :( – Raynos

+0

@ रेनोस हाँ, यही कारण है कि मैं 'app.set()' –

+1

का उपयोग करता हूं ठीक है, वैश्विक स्तर पर क्लाइंट को अच्छी तरह से बनाएं, यह अभी भी req.mysql है और अच्छी तरह से फिट होना प्रतीत होता है गुजरने के एक्सप्रेस वास्तुकला के साथ, चारों ओर res। – kgilpin

संबंधित मुद्दे