2016-01-17 18 views
7

私はノードを使い慣れていないので、自分のコードからサードパーティのAPIを呼び出す必要があります。このリンクのhttp.requestを使用してこれを行う方法を見つけましたhttps://docs.nodejitsu.com/articles/HTTP/clients/how-to-create-a-HTTP-request。私がする必要があるのは、2つの異なるapi urlを呼び出し、2番目の呼び出しで最初の呼び出しの応答データを使用することです。これはresource2のparamとしてIDになります。複数のチェーンNode httpリクエスト

どのように私はこれらの呼び出しの2つを連鎖して混乱させることなく連鎖させるのか分かりません。どんな助けもありがとう。

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

まず、あなたは、そのシンプルさのためにHTTPリクエストのための最も人気のある選択肢である、requestを見てみたいと思うでしょう。

第2に、要求の単純さと約束のコンセプトを組み合わせて、複数の要求を連続して行い、コードをフラットに保つことができます。私たちが望むようあなたが見ることができるように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 

使用
は、我々はできるだけ多くのリクエストを追加することができ、そしてコードがフラットでシンプルなままになります。ボーナスとして、エラー処理も追加できました。伝統的なコールバックを使用すると、すべてのコールバックにエラー処理を追加する必要がありますが、ここではプロミスチェーンの最後で一度だけ行う必要があります。

UPDATE(9月16日):約束は中途半端そこに私たちを取る一方で、更なる経験は同期、非同期コード間の混合がたくさんある時にのみ約束厄介ことを私に確信しており、特に、例えば場合(フローを制御します-else)。これを解決するための標準的な方法はasync/awaitですが、まだ開発中であり、蒸散が必要です。したがって、generatorsは次善策です。今書いている時点でのノードの最新バージョン(7.2.1)がサポートしていることを非同期/のawait --harmony旗の後ろに、あなたができる: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)使用

これは:

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

大まかに私が入力していた答え。 'request'とPromisesの両方を使うことは素晴らしい提案です。 –

+0

ありがとうございますが、表現文が代入や呼び出しではありません。要求の約束以外に追加する必要のあるライブラリがありますか? .then(応答=> { –

+1

あなたは他のライブラリは必要ありません。ES5で書いてみてください。あなたのノードのバージョンは太い矢印の表記法をサポートしていないかもしれません。.then(function(response){...}) –

関連する問題