0

これは当然の質問のように思えますが、私は当惑しています。URI でリソースをダウンロードする Node 関数が必要です。ユーザーがどのタイプであるかを指定する必要なく、いくつかの異なるコンテンツタイプで機能する必要があります。

画像になることがわかっている場合にパイプrequestする方法fs.createWriteStreamは知っていますが、リクエストからコールバックを既に呼び出している場合にそれを処理する方法はわかりません。私がいる場所は次のとおりです。

var request = require('request'),
    fs = require('graceful-fs');

function cacheURI(uri, cache_path, cb) {
    request(uri, function(err, resp, body) {
        var content_type = resp.headers['content-type'].toLowerCase().split("; ")[0],
            type = content_type.split("/")[0],
            sub_type = content_type.split("/")[1];

        if (sub_type == "json") {
            body = JSON.parse(body);
        }

        if (type == "image") {
            // this is where the trouble starts
            var ws = fs.createWriteStream(cache_path);
            ws.write(body);
            ws.on('close', function() {
                console.log('image done');
                console.log(resp.socket.bytesRead);
                ws.end();
                cb()
            });         
        } else {
            // this works fine for text resources
            fs.writeFile(cache_path, body, cb);     
        }


    });
}

前の質問に対するこの回答は、次のことを示唆しています。

request.get({url: 'https://someurl/somefile.torrent', encoding: 'binary'}, function (err, response, body) {
  fs.writeFile("/tmp/test.torrent", body, 'binary', function(err) {
    if(err)
      console.log(err);
    else
      console.log("The file was saved!");
  }); 
});

requestただし、取得する応答の種類がまだわからない場合は、「バイナリ」を渡すことはできません。

アップデート

提案された回答によると、イベントハンドラーで「close」を「finish」に変更すると、コールバックが発生します。

        if (opts.image) {
            var ws = fs.createWriteStream(opts.path);
            ws.on('finish', function() {
                console.log('image done');
                console.log(resp.socket.bytesRead);
            });
            //tried as buffer as well
            //ws.write(new Buffer(body));
            ws.write(body);
            ws.end();
        }

これは画像ファイルを書き込みますが、正しくはありません:

ここに画像の説明を入力

4

1 に答える 1

0

hereで提案されているように、イベントを使用してみてくださいfinish(ノード >= v0.10 の場合)

ws.on('finish', function() {
    console.log('image done');
    console.log(resp.socket.bytesRead);
    ws.end();
    cb()
});
于 2015-01-21T23:07:16.303 に答える