Node.js HTTP请求:如何检测响应正文编码?

我正在使用https.request()使用以下熟悉的模式进行HTTPS请求:

 var request = https.request(options, function (response) { var chunks = []; response.on('data', function (chunk) { chunks.push(chunk); }); response.on('end', function () { var buffer = Buffer.concat(chunks); ... }); }); ... request.end(); ... 

一旦我有完成的响应Buffer ,它需要打包到一个JSON对象。 原因是因为我正在创build一种隧道,HTTP响应(它的标题,状态和正文)将通过另一个协议作为JSON发送。

因此,可以支持文本和二进制响应,到目前为止,我的作品是将Buffer编码为Base64(使用buffer.toString('base64') ),并在另一端使用new Buffer(theJsonObject.body, 'base64') 。 虽然这样做,如果我可以有select地只执行Base64编码,如果HTTP请求响应已知是二进制types(如图像)将更有效。 否则,在上面显示的https.request()callback中,我可以简单地执行chunk.toString() ,并将JSON对象中的响应正文作为UTF-8stringtypes传递。 我的JSON对象可能会包含一个额外的属性,告诉隧道的另一端是否“身体”是一个UTF-8string(例如.htm,.css等)或Base64编码(如图像) 。

我可以做的是尝试在响应content-type头中使用MIMEtypes来确定响应是否将是二进制的。 我可能会维护一个types的“白名单”,我知道它是安全的UTF-8(如“文本/ HTML”等)。 所有其他的(包括例如'image / png')将被Base64编码。

谁能提出一个更好的解决scheme?

你可以通过检查缓冲区的魔数来使用file-type包来检测文件types吗?

安装

 npm install --save file-type 

用法

 var fileType = require('file-type'); var safeTypes = ['image/gif']; var request = https.request(options, function (response) { var chunks = []; response.on('data', function (chunk) { chunks.push(chunk); }); response.on('end', function () { var buffer = Buffer.concat(chunks); var file = fileType(buffer) ); console.log( file ); //=> { ext: 'gif', mime: 'image/gif' } // mime isn't safe if ( safeTypes.indexOf(file.mime) == '-1' ) { // do your Base64 thing } }); }); ... request.end(); ... 

如果你想保持你的代码包免费看看Github上的包源代码 ,它是相当小的。