2016-01-17 9 views
7

मैं नोड के लिए नया हूं और मेरे कोड से तृतीय पक्ष एपीआई कॉल करने की आवश्यकता है। मैंने पाया कि इस लिंक से http.request का उपयोग करके इसे कैसे करें https://docs.nodejitsu.com/articles/HTTP/clients/how-to-create-a-HTTP-request। मुझे जो करना है वह दो अलग-अलग एपीआई यूआरएल को कॉल करता है और दूसरे कॉल में पहली कॉल से प्रतिक्रिया डेटा का उपयोग करता है जो संसाधन 2 पर एक param के रूप में सिर्फ एक आईडी होगा।चेन एकाधिक नोड http अनुरोध

मुझे नहीं पता कि मैं इन दो कॉलों को एक डुप्लिकेट गड़बड़ के बिना कैसे जोड़ूंगा। किसी भी सहायता की सराहना की जाएगी।

var url1 = { 
    host: 'www.domain.com', 
    path: '/api/resourse1' 
}; 

var url2 = { 
    host: 'www.domain.com', 
    path: '/api/resourse2/{id}' 
}; 

var callback = function (response) { 
    var str = ''; 

    response.on('data', function (chunk) { 
     str += chunk; 
    }); 

    response.on('end', function() { 
     console.log(str); 
    }); 
} 

http.request(url1, callback).end(); 

उत्तर

23

सबसे पहले, आपको request पर एक नज़र है, जो HTTP अनुरोध के लिए सबसे लोकप्रिय विकल्प है, अपनी सादगी की वजह से लेने के लिए चाहता हूँ।

दूसरा, हम उत्तराधिकार में एकाधिक अनुरोध करने के लिए, वादा फ्लैट में रखते हुए, अनुरोधों की सादगी के साथ अनुरोध की सादगी को जोड़ सकते हैं।
request-promise

var rp = require('request-promise') 
var url1 = {} 
var url2 = {} 
var url3 = {} 


rp(url1) 
    .then(response => { 
    // add stuff from url1 response to url2 
    return rp(url2) 
    }) 
    .then(response => { 
    // add stuff from url2 response to url3 
    return rp(url3) 
    }) 
    .then(response => { 
    // do stuff after all requests 

    // If something went wrong 
    // throw new Error('messed up') 
    }) 
    .catch(err => console.log) // Don't forget to catch errors 

का उपयोग करके आप देख सकते हैं, हम के रूप में कई अनुरोधों के रूप में हम चाहते हैं जोड़ सकते हैं, और कोड फ्लैट और सरल रहना होगा। बोनस के रूप में, हम त्रुटि-हैंडलिंग भी जोड़ सकते थे। पारंपरिक कॉलबैक का उपयोग करके, आपको प्रत्येक कॉलबैक में त्रुटि-प्रबंधन जोड़ना होगा, जबकि यहां हमें केवल वादा श्रृंखला के अंत में इसे करना होगा।

अद्यतन (16/09): जबकि वादे हमें आधे रास्ते वहाँ ले, आगे अनुभव ने मुझे आश्वस्त किया है कि अकेले वादे गंदा मिलता है जब वहाँ सिंक, async कोड के बीच मिश्रण का एक बहुत है, और विशेष रूप से प्रवाह को नियंत्रित (जैसे अगर -अन्य)। इसे हल करने का वैधानिक तरीका async/await के साथ होगा, हालांकि यह अभी भी विकास में है और इसके लिए ट्रांसमिशन की आवश्यकता होगी। इस प्रकार, generators अगला सबसे अच्छा समाधान है।

का उपयोग co

var co = require('co') 
var rp = require('request-promise') 
var url1 = {} 
var url2 = {} 
var url3 = {} 

co(function*() { 
    var response 
    response = yield rp(url1) 
    // add stuff from url1 response to url2 
    response = yield rp(url2) 
    // add stuff from url2 response to url3 
    response = yield rp(url3) 

    // do stuff after all requests 

    // If something went wrong 
    // throw new Error('messed up') 
}) 
.catch(err => console.log) // Don't forget to catch errors 

अद्यतन (12/16): अब नवीनतम लिखने के समय नोड के संस्करण (7.2.1) का समर्थन करता async/इंतजार --harmony ध्वज के पीछे, तुम कर सकते हो यह:

const rp = require('request-promise') 
const url1 = {} 
const url2 = {} 
const url3 = {} 

async function doRequests() { 
    let response 
    response = await rp(url1) 
    // add stuff from url1 response to url2 
    response = await rp(url2) 
    // add stuff from url2 response to url3 
    response = await rp(url3) 

    // do stuff after all requests 

    // If something went wrong 
    // throw new Error('messed up') 
} 

doRequests() 
.catch(err => console.log) // Don't forget to catch errors 
+0

काफी जवाब मैं टाइप कर रहा था। 'अनुरोध' और वादा का उपयोग कर दोनों उत्कृष्ट सुझाव हैं। –

+0

धन्यवाद लेकिन मुझे अभिव्यक्ति कथन प्राप्त हो रहा है एक असाइनमेंट या कॉल नहीं है। क्या अनुरोध करने के अलावा मुझे एक और पुस्तकालय जोड़ने की ज़रूरत है? .then (प्रतिक्रिया => { –

+1

हम्म, आपको किसी अन्य पुस्तकालय की आवश्यकता नहीं है। ES5 में लिखने का प्रयास करें, आपका नोड संस्करण वसा तीर नोटेशन का समर्थन नहीं कर सकता है। तब (फ़ंक्शन (प्रतिक्रिया) {...}) –

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