使用node request和fs Promisified下载图像,node.js中没有管道

使用node request和fs Promisified下载图像,node.js中没有管道,node.js,promise,bluebird,fs,node-request,Node.js,Promise,Bluebird,Fs,Node Request,我一直在努力成功地下载图像而不将其传送到fs。以下是我所取得的成就: var Promise = require('bluebird'), fs = Promise.promisifyAll(require('fs')), requestAsync = Promise.promisify(require('request')); function downloadImage(uri, filename){ return requestAsync(uri)

我一直在努力成功地下载图像而不将其传送到fs。以下是我所取得的成就:

var Promise = require('bluebird'),
    fs = Promise.promisifyAll(require('fs')),
    requestAsync = Promise.promisify(require('request'));

function downloadImage(uri, filename){
    return requestAsync(uri)
        .spread(function (response, body) {
            if (response.statusCode != 200) return Promise.resolve();
            return fs.writeFileAsync(filename, body);
        })
       .then(function () { ... })

       // ...
}
有效的输入可能是:

downloadImage('http://goo.gl/5FiLfb', 'c:\\thanks.jpg');
我确实认为问题在于处理
body
。 我试着用几种编码将它转换成一个
缓冲区
新缓冲区(body,'binary')
等),但都失败了


感谢前方的帮助

您必须告诉
请求
数据是二进制的:

requestAsync(uri, { encoding : null })
记录:

encoding
-用于响应数据的setEncoding的编码。如果为null,则返回主体作为缓冲区。其他任何内容(包括默认值undefined)都将作为编码参数传递给toString()(这意味着默认情况下这实际上是utf8)


因此,如果没有该选项,正文数据将被解释为UTF-8编码,而不是UTF-8编码(并生成无效的JPEG文件)。

谢谢!我不知道我是怎么错过的。:)这个答案最终帮助我保存了获取的有效PDF。我试过了,但结果文件总是损坏(并且比应该的大)。事实证明,问题在于它是如何重新开始的。添加
encoding:null
修复了它,然后无论我在
fs.writeFile()期间使用哪种编码,它都可以很好地保存。谢谢你知道流是怎么做到的吗?