2013-05-31 4 views
33

बनाता है मैं नोड.जेएस के भीतर एक विश्वसनीय API बनाने के लिए एक्सप्रेस मॉड्यूल का उपयोग कर रहा हूं। मेरी सेवा में मैं बाहरी एंडपॉइंट्स (सर्वर साइड) के लिए अतिरिक्त http अनुरोध कर रहा हूं और मुझे उन वेब अनुरोधों से डेटा को अपने वेब सेवा अनुरोध निकाय में वापस करने की आवश्यकता है।नोड.जेएस आरईएसटी सेवा के कॉलबैक के लिए प्रतीक्षा करें जो HTTP अनुरोध

मैंने पुष्टि की है कि यदि मैं वेब सेवा संचालित करने वाले सभी कार्यों पर console.log का उपयोग करता हूं तो मुझे वह डेटा मिल रहा है जो मुझे चाहिए। हालांकि, जब मैं उन मूल्यों को सेवा में वापस करने का प्रयास करता हूं तो वे वापस वापस आते हैं। मुझे पता है कि यह async की वजह से है और कॉलबैक http अनुरोध को समाप्त करने की प्रतीक्षा नहीं कर रहा है।

क्या यह काम करने का कोई तरीका है?

+0

आपको कॉलबैक स्वीकार करने की आवश्यकता है। – SLaks

उत्तर

41

async मॉड्यूल का उपयोग करना एक आम अभ्यास है।

npm install async 

async मॉड्यूल अतुल्यकालिक घटनाओं के विभिन्न रूपों को संभालने के लिए पुरातन है।

आपके मामले में, async#parallel कॉल आपको एक ही समय में सभी बाहरी एपीआई के लिए अनुरोध करने की अनुमति देगा और फिर परिणामों को आपके अनुरोधकर्ता के पास वापस करने के लिए गठबंधन करेगा।

चूंकि आप बाहरी http अनुरोध कर रहे हैं, तो आपको शायद request मॉड्यूल उपयोगी भी मिलेगा।

npm install request 

request और async#parallel अपने मार्ग हैंडलर का उपयोग करते हुए कुछ इस तरह दिखेगा ...

var request = require('request'); 
var async = require('async'); 

exports.handler = function(req, res) { 
    async.parallel([ 
    /* 
    * First external endpoint 
    */ 
    function(callback) { 
     var url = "http://external1.com/api/some_endpoint"; 
     request(url, function(err, response, body) { 
     // JSON body 
     if(err) { console.log(err); callback(true); return; } 
     obj = JSON.parse(body); 
     callback(false, obj); 
     }); 
    }, 
    /* 
    * Second external endpoint 
    */ 
    function(callback) { 
     var url = "http://external2.com/api/some_endpoint"; 
     request(url, function(err, response, body) { 
     // JSON body 
     if(err) { console.log(err); callback(true); return; } 
     obj = JSON.parse(body); 
     callback(false, obj); 
     }); 
    }, 
    ], 
    /* 
    * Collate results 
    */ 
    function(err, results) { 
    if(err) { console.log(err); res.send(500,"Server Error"); return; } 
    res.send({api1:results[0], api2:results[1]}); 
    } 
); 
}; 

तुम भी अन्य कॉलबैक अनुक्रमण तरीकों here के बारे में पढ़ सकते हैं।

+0

यह आशाजनक लग रहा है। मैं इसे कैसे शुरू करूं? – Rob

+0

ने इसे समझ लिया। धन्यवाद! – Rob

+0

वाह। आप मुझे खोज के घंटे बचाते हैं –

17

नोड.जेएस कॉलबैक के बारे में सब कुछ है। जब तक एपीआई कॉल सिंक्रोनस (दुर्लभ और नहीं किया जाना चाहिए) आप कभी भी उन कॉल से मूल्य वापस नहीं करते हैं, लेकिन कॉलबैक विधि के भीतर से परिणाम के साथ कॉलबैक करते हैं, या एक्सप्रेस विधि res.send

के लिए एक महान लाइब्रेरी वेब अनुरोधों का आह्वान करना request.js

चलो Google को कॉल करने का वास्तव में सरल उदाहरण लें।

var request = require('request'); 
app.get('/callGoogle', function(req, res){ 
    request('http://www.google.com', function (error, response, body) { 
    if (!error && response.statusCode == 200) { 
     // from within the callback, write data to response, essentially returning it. 
     res.send(body); 
    } 
    }) 
}); 

वैकल्पिक रूप से, आप विधि है कि वेब अनुरोध का आह्वान करने के लिए एक कॉलबैक पारित कर सकते हैं, और कहा कि विधि के भीतर से है कि कॉलबैक आह्वान:

app.get('/callGoogle', function(req, res){ 
    invokeAndProcessGoogleResponse(function(err, result){ 
    if(err){ 
     res.send(500, { error: 'something blew up' }); 
    } else { 
     res.send(result); 
    } 
    }); 
}); 

var invokeAndProcessGoogleResponse = function(callback){ 
    request('http://www.google.com', function (error, response, body) { 

    if (!error && response.statusCode == 200) { 
     status = "succeeded"; 
     callback(null, {status : status}); 
    } else { 
     callback(error); 
    } 
    }) 
} 
res.send का उपयोग करना, अपने express.js कोड दिखाई दे सकता है डैनियल उत्तर से से

उदाहरण:

3

Wait.for https://github.com/luciotato/waitfor

अन्य जवाब के wait.for के उपयोग के उदाहरण (async), लेकिन प्रतीक्षा करें।

var request = require('request'); 
var wait = require('wait.for'); 

exports.handler = function(req, res) { 
try { 
    //execute parallel, 2 endpoints, wait for results 
    var result = wait.parallel.map(["http://external1.com/api/some_endpoint" 
       ,"http://external2.com/api/some_endpoint"] 
       , request.standardGetJSON); 
    //return result 
    res.send(result); 
} 
catch(err){ 
    console.log(err); 
    res.end(500,"Server Error") 
} 
}; 

//wait.for requires standard callbacks(err,data) 
//standardized request.get: 
request.standardGetJSON = function (options, callback) { 
    request.get(options, 
      function (error, response, body) { 
       //standardized callback 
       var data; 
       if (!error) data={ response: response, obj:JSON.parse(body)}; 
       callback(error,data); 
      }); 
} 
संबंधित मुद्दे