2011-08-28 11 views
25

私はnode-request moduleを活用しようとしていますが、ドキュメントはそれほど大きくありません。私が有効なリソースに要求し、それを書き込み可能なストリームにパイプすると、すべて正常に動作します。しかし、無効なオブジェクトに対して要求を行うと、書き込み可能なストリームが作成されます。たとえば、次のスニペットを取る:foo.jpgというリソースがサーバー上に存在するノード要求 - 要求中にエラーが発生したかどうかを判断する方法?

var x = request("http://localhost:3000/foo.jpg"); 
var st = fs.createWriteStream("foo.jpg"); 
x.pipe(st); 

場合は、データがストリームにパイプされ、そしてそれは、サーバー上のファイルの罰金を作成します。ただし、foo.jpg がサーバーにが存在しない場合は、空のコンテナファイルが作成されます。エラーイベントまたは要求が、私は以下のようなものを試してみた404を返されたかどうかを判断するために活用することができるものはないように見える:

var x = request("http://localhost:3000/foo.jpg", function(err, response, body) { 
    if(response.statusCode === 200) { 
     // Success 
     var st = fs.createWriteStream("foo.jpg"); 
     x.pipe(st); 
    } 
}); 

も:

request("http://localhost:3000/foo.jpg", function(err, response, body) { 
    if(response.statusCode === 200) { 
     // Success 
     var x = response.request; 
     var st = fs.createWriteStream("foo.jpg"); 
     x.pipe(st); 
    } 
}); 

NOに利用可能。アイデアはかなりシンプルです。私は、URLで識別されるファイルをローカルサーバーにコピーしたいだけです。リクエストが無効な場合(404など)、ファイルをパイプしません。要求が有効な場合は、ファイルをパイプします。助言がありますか?

+0

あなたがここで達成したいとは思っていません。あなたはいつ何をコピーしたいのですか? – Qcom

+6

神の愛のために、ノードリクエストの代わりに['request'](https://github.com/mikeal/request)を使います。 – Raynos

答えて

40

私は要求を書いた:)

あなたがしようとする場合があります。この

var r = request(url) 
r.on('response', function (resp) { 
    resp.headers 
    resp.statusCode 
    r.pipe(new WritableStream()) 
}) 
+1

ステータスコードが503で、サーバーの応答に応答をパイプしたい場合、どのように要求を再試行しますか? – naugtur

+0

が見つかりました。私の答えをチェックしてください。 – naugtur

+0

私はリクエストを使用しています。ファイルがすべてダウンロードされてストリームに保存された後、コールバックがどのように得られるのだろうか?ファイルをダウンロードするときに何かする必要があります。 @mikeal – xtu

-5

httpモジュールを直接使用してみませんか? http.request

エラーをキャッチするために使用できる「エラー」イベントがあります。

+9

'http.request'は' request'と比較して低レベルのAPIなのでそれは使用する痛みです – Raynos

+0

私は、ネイティブhttp.requestが行く方法かもしれないと思います。 – naivedeveloper

5

@Mikealソリューションは偉大に見えるが、(最初の数バイトを見逃すことができます)配管といくつかの問題がある可能性があります。 喜が更新されたコードです:

var r = request(url) 
r.pipe(new WritableStream()); 
r.on('response', function (resp) { 
    resp.headers 
    resp.statusCode 
    // Handle error case and remove your writablestream if need be. 
}) 
+0

あなたは素晴らしいです! writableStreamをクローズしました。そうしないと、プロセスが終了します。乾杯! – FacePalm

+0

しかし、ページが404と応答本文の両方を返す場合はどうなりますか?書き込まれたファイルを削除しますか? –

17

私はノードの新しいストリームで成功してしまった方法:

function doQuery(){ 
    var r = request(url) 
    r.pause() 
    r.on('response', function (resp) { 
     if(resp.statusCode === 200){ 
      r.pipe(new WritableStream()) //pipe to where you want it to go 
      r.resume() 
     }else{ } 
    }) 
} 

これは本当に柔軟である - あなたが再試行したい場合は、再帰関数を呼び出すことができますsetTimeout

function doQuery(){ 
    var r = request(url) 
    r.pause() 
    r.on('response', function (resp) { 
     if(resp.statusCode === 200){ 
      r.pipe(new WritableStream()) //pipe to where you want it to go 
      r.resume() 
     }else{ 
      setTimeout(doQuery,1000) 
     } 
    }) 
} 
+1

@ mikealの回答と比較して、ストリームの一時停止と再開が必要な理由を明確にしてください。 –

+0

確かにわかるまで、ストリームを一時停止したい(データを取得しない)ので、そのサーバー上のリソースが終了するからだと思います。それが存在すると確信できたら、いつでもそのストリームをパイプして、そのリソースのダウンロード/ストリーミングを再開します(実際には開始します)。 –

+1

私はそのコメントを一度書きましたが、何が起こったのかわかりません...ストリームがあまりにも早く流れ始め、読み込み中に最初の数バイトを持たないファイルが得られます。 – naugtur

関連する問題