2016-08-08 13 views
8

में 2 प्रश्नों के उत्पादन को मिलाएं मैं node.js मॉड्यूल को पुन: स्थापित कर रहा हूं। मेरे पास एक आरईएसटी एपीआई है जो जेसन में एक एकल MySQL क्वेरी के परिणाम आउटपुट करता है। एपीआई का कोड यहां दिया गया है;आरईएसटी एपीआई

var rest_api_get_list = function (app, url_name) { 
    function respond(req, res, next) { 
     var door_mac = req.query.door_mac; 

     var connection = own_mysql.getMySQL_connection(); 

     var query_str = 
       "SELECT doors.mac_addr, " + 
       "sensors.sensor_type " + 
       "FROM sensors " + 
       "WHERE (doors.mac_addr = ?) " 
      ; 

     var query_var = [door_mac]; 

     var query = connection.query(query_str, query_var, function (err, rows, fields) { 
      //if (err) throw err; 
      if (err) { 
       //throw err; 
       console.log(err); 
       logger.info(err); 
      } 
      else { 
       res.send(rows); 
      } 
     }); 
     return next(); 
    } 

    app.get(url_name, respond); 
}; 

मान लीजिए मेरे पास एक और क्वेरी है जो ऐसा कुछ दिखती है;

var query_str_2 = 
      "SELECT knobs.mac_addr, " + 
      "furniture.furniture_type " + 
      "FROM furnitures" + 
      "WHERE (knobs.mac_addr = ?) " 
     ; 

2 MySQL के उत्पादन में प्रश्नों query_str और query_str_2 गठबंधन और REST API json में परिणाम वापसी करना चाहते हैं। यह कैसे किया जा सकता है?

स्पष्ट होने के लिए, मैं इस तरह कुछ करने वाले कोड के बारे में सोच रहा हूं;

var rest_api_get_list = function (app, url_name) { 
    function respond(req, res, next) { 
     var door_mac = req.query.door_mac; 

     var connection = own_mysql.getMySQL_connection(); 

     var query_str = 
       "SELECT doors.mac_addr, " + 
       "sensors.sensor_type " + 
       "FROM sensors " + 
       "WHERE (doors.mac_addr = ?) " 
      ; 

     var query_var = [door_mac]; 

     var query = connection.query(query_str, query_var, function (err, rows_output_1, fields) { 
      //if (err) throw err; 
     }); 

     var query_str_2 = 
      "SELECT knobs.mac_addr, " + 
      "furniture.furniture_type " + 
      "FROM furnitures" + 
      "WHERE (knobs.mac_addr = ?) " 
     ; 

     var query_2 = connection.query(query_str_2, query_var, function (err, rows_output_2, fields) { 
      //if (err) throw err; 

     }); 

     //How to display json output of rows_output_1 and rows_output_2? 

     return next(); 
    } 

    app.get(url_name, respond); 
}; 

संपादित करें: मैंने वादे का उपयोग करने वाले उत्तरों को आकर्षित करने के लिए एक उदारता शुरू की।

+1

क्या आप पूछ रहे हैं कि दो प्रश्न कैसे करें या क्या आप वास्तव में एसक्यूएल प्रश्न पूछ रहे हैं कि कैसे जुड़ें? – HeadCode

+0

हेडकोड, स्पष्ट होने के लिए खेद है। यह एक एसक्यूएल सवाल नहीं है। मैं पूछ रहा हूं कि 2 प्रश्न कैसे करें और जेसन में 2 प्रश्नों के संयुक्त परिणाम को वापस कर दें। मैंने इसे स्पष्ट करने के लिए प्रश्न संपादित किया है। धन्यवाद। –

+1

इस समस्या का मुश्किल हिस्सा node.js. की असीमित प्रकृति है। प्रश्न दूसरे के बाद एक नहीं चला सकते हैं। यह देखना दिलचस्प होगा कि इस प्रश्न का उत्तर देने के लिए ब्लूबर्ड जैसे वादे या मॉड्यूल का उपयोग कैसे किया जाता है। – user781486

उत्तर

6

एसिंक्रोनस नियंत्रण प्रवाह के प्रबंधन के लिए एक मॉड्यूल - जैसे async - इससे आपको मदद मिल सकती है।

उदाहरण के लिए:

function respond(req, res, next) { 

    var door_mac = req.query.door_mac; 
    var connection = own_mysql.getMySQL_connection(); 
    var query_var = [door_mac]; 

    async.parallel([ 
     function (callback) { 

      var query_str = 
       "SELECT doors.mac_addr, " + 
       "sensors.sensor_type " + 
       "FROM sensors " + 
       "WHERE (doors.mac_addr = ?) " 
      ; 
      connection.query(query_str, query_var, callback); 
     }, 
     function (callback) { 

      var query_str_2 = 
       "SELECT knobs.mac_addr, " + 
       "furniture.furniture_type " + 
       "FROM furnitures" + 
       "WHERE (knobs.mac_addr = ?) " 
      ; 
      connection.query(query_str_2, query_var, callback); 
     } 
    ], function (error, results) { 

     // results[0] => result for query_str 
     // results[1] => result for query_str_2 
     // ... return next() or whatever 
    })  
} 
+0

धन्यवाद। Upvoted। मुझे इसे आज़माना है। क्या आपको पता चलेगा कि समाधान वादाबर्ड मॉड्यूल जैसे वादे या कुछ कैसे उपयोग कर सकता है? –

+1

आपके प्रश्न में दिए गए कोड में कॉलबैक-आधारित API शामिल था, इसलिए मेरा जवाब उस खाते में आया। हां, आप वादे का उपयोग कर सकते हैं, लेकिन आपको कॉलबैक-आधारित एपीआई को एक वादे में बदलने के लिए ब्लूबर्ड के [promisify] (http://bluebirdjs.com/docs/api/promise.promisify.html) जैसे कुछ उपयोग करने की आवश्यकता होगी। आधारित एपीआई। एक बार आपके पास एक एपीआई है जो वादे देता है, तो आप एक [Promise.all] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/all) को 'गठबंधन' करने के लिए करेंगे परिणाम। – cartant

+0

धन्यवाद। मुझे लगता है कि कॉलबैक और एसिंक का उपयोग करके आपका समाधान सबसे अच्छा होगा क्योंकि मूल कोड में कॉलबैक-आधारित API शामिल था। –

3

आप समानांतरवाद के लिए पूछ रहे हैं, के रूप में @cartant कहते हैं, आप async या (ज्यादा बेहतर) वादों (Promise.all(p1, p2).then(...)) का उपयोग कर सकते हैं। इस तरह से आप प्रदर्शन

var query_str = 
    "SELECT doors.mac_addr, " + 
    "sensors.sensor_type as type " + 
    "FROM sensors " + 
    "WHERE (doors.mac_addr = ?) " + 
    "UNION " + 
    "SELECT knobs.mac_addr, " + 
    "furniture.furniture_type as type " + 
    "FROM furnitures" + 
    "WHERE (knobs.mac_addr = ?) " 
; 

:

लेकिन अगर आप इष्टतम दृष्टिकोण के लिए पूछ रहे हैं, आप के बजाय किसी एक क्वेरी में कर सकते हैं (समानांतरवाद तेजी से परिणाम वास्तविक परिणाम की खपत प्रति अधिक संसाधनों की कीमत पर देता है) एकल डेटाबेस कॉल और, ज़ाहिर है, डेटाबेस किसी समानांतरता नहीं करेगा लेकिन इसके बजाय, यह निम्न संसाधन खपत के साथ सबसे अच्छे समय पर उत्तर पाने का सबसे अच्छा प्रयास करेगा।

इसलिए, यदि आपको कई और अनुरोधों में भाग लेना है, तो दूसरी तरफ, यदि आप ऐसे माहौल में तेजी से परिणाम मांग रहे हैं जहां संसाधनों की अधिक परवाह नहीं है, तो समानांतर दृष्टिकोण बेहतर होगा।

+1

परिणाम विलय करना भी महंगा है। यह हो सकता है कि बड़ी मात्रा में डेटा के साथ एक ही क्वेरी करने के लिए तेज़ होगा, फिर दो समानांतर में। – Eyal

+0

तो सच है। कम से कम एक साधारण _union_ के लिए।समांतर में अनुकूलित करने के लिए अधिक जटिल विलय पैटर्न आसान हो सकते हैं। विशेष रूप से जब सभी प्रश्न (अलग संस्करण के) बड़े नहीं होते हैं। लेकिन, सामान्य रूप से, यह सच है: स्मृति में विशाल डेटा परिवर्तनों को संभालना गधे में दर्द जैसा है ;-) – bitifet

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