これは当然の質問のように思えますが、私は当惑しています。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();
}
これは画像ファイルを書き込みますが、正しくはありません: