2016-01-17 6 views
7

Ich bin neu zu Knoten und muss eine Drittpartei API aus meinem Code aufrufen. Ich habe gefunden, wie dies zu tun ist, indem Sie http.request von diesem Link https://docs.nodejitsu.com/articles/HTTP/clients/how-to-create-a-HTTP-request. Was ich tun muss, ist zwei verschiedene API-URLs aufzurufen und die Antwortdaten des ersten Anrufs im zweiten Anruf zu verwenden, der nur eine ID als Parameter für Ressource2 ist.Chain multiple Node http Anfrage

Ich weiß nicht, wie ich zwei dieser Anrufe zusammenketteln würde, ohne dass es sich um ein Duplikat handelt. Jede Hilfe wäre willkommen.

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(); 

Antwort

23

Zunächst sollten Sie einen Blick auf request nehmen, die populärste Wahl Anfragen für HTTP ist aufgrund seiner Einfachheit.

Zweitens können wir die Einfachheit der Anfrage mit dem Konzept der Versprechen kombinieren, um mehrere Anfragen nacheinander zu machen, während der Code flach gehalten wird.
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 

Wie Sie sehen können, können wir so viele Anfragen hinzufügen, wie wir wollen, und der Code wird flach und einfach bleiben. Als Bonus konnten wir die Fehlerbehandlung hinzufügen. Bei herkömmlichen Callbacks müssten Sie jedem Callback eine Fehlerbehandlung hinzufügen, während Sie dies hier nur einmal am Ende der Promise-Kette tun müssen.

UPDATE (16.09): Während Promises uns nehmen halber Strecke hat weitere Erfahrung mich überzeugt, dass allein unordentlich Versprechen bekommen, wenn es eine Menge Mischen zwischen sync, async Code und insbesondere Fluss zu steuern (zB wenn -sonst). Der kanonische Weg, dies zu lösen, wäre mit async/await, jedoch ist das immer noch in der Entwicklung und würde eine Transpilation erfordern. Als solche sind generators die nächstbeste Lösung.

Mit 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 

UPDATE (12/16): Nun, da die neueste Version des Knotens zum Zeitpunkt des Schreibens (7.2.1) unterstützt async/await hinter dem --harmony Flagge, die Sie tun können dies:

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

Ungefähr die Antwort, die ich tippte. Sowohl die Verwendung von "Anfrage" als auch die Verwendung von Versprechen sind ausgezeichnete Vorschläge. –

+0

Danke, aber ich bekomme Ausdruck Aussage ist keine Aufgabe oder Anruf. Gibt es eine andere Bibliothek, die ich neben der Anfrage hinzufügen muss? .then (response => { –

+1

Hmm, du brauchst keine anderen Bibliotheken. Versuche in ES5 zu schreiben, deine Knoten-Version unterstützt möglicherweise nicht die fette Pfeilnotation. .then (function (response) {...}) –