今天写代码的时候用了iconv-lite库的decode方法,报了warning。据说弃用了,于是顺着他的链接看了具体的文章,记录如下。TransferfromUseBufferswhendecoding首先下面是错误的:varhttp=require('http'),iconv=require('iconv-lite');http.get("http://website.com/",function(res){varbody='';res.on('data',function(chunk){body+=chunk;});res.on('end',function(){vardecodedBody=iconv.decode(body,'win1252');console.log(decodedBody);});});在调用iconv.decode函数之前,原始数据已经通过javascript进行了解码。res.on('data',function(chunkBuffer){body+=chunkBuffer.toString('utf8');});也就是说,如果再次调用iconv.decode,实际上是解码了两次,会丢失原来的二进制数据。如果使用res.setEncoding('utf-8')也会有同样的效果。真正正确的做法是使用Buffer类型的数组接收数据,然后拼接,最后decode。代码如下:http.get("http://website.com/",function(res){varchunks=[];res.on('data',function(chunk){chunks.push(chunk);});res.on('end',function(){vardecodedBody=iconv.decode(Buffer.concat(chunks),'win1252');console.log(decodedBody);});});//或者,对于iconv-lite@0.4和Nodev0.10+,您可以通过`collect`帮助程序使用流式支持http.get("http://website.com/",function(res){res.pipe(iconv.decodeStream('win1252')).collect(function(err,decodedBody){console.log(decodedBody);});});最后作者还提到了如何让警告静音:iconv.skipDecodeWarning=true;```
