Node.js:如何禁用分块传输编码?

我从一个节点服务器响应来自另一个位置的pipe道.zip文件的content-length标题。 我已经通过下面的代码注入了一个content-length头文件,但似乎transfer-encoding: chunked覆盖它以某种方式。

响应头

 HTTP/1.1 200 OK access-control-allow-origin: * connection: close content-type: application/zip date: Mon, 14 Jul 2014 03:47:00 GMT etag: "\"eb939974703e14ee9f578642972ed984\"" last-modified: Sat, 12 Jul 2014 02:15:52 GMT server: Apache-Coyote/1.1 set-cookie: rememberMe=deleteMe; Path=/; Max-Age=0; Expires=Sun, 13-Jul-2014 03:47:00 GMT transfer-encoding: chunked X-Powered-By: Express 

 var request = require('request'); var express = require('express'); var async = require('async'); var app = express(); app.get('/:bundle_id?', function(req, res) { var bundle_id = req.params.bundle_id; bundle_id = bundle_id.replace(/\.zip$/, ''); var url = "https://url....../bundles/" + bundle_id; async.waterfall([ function(callback) { request.get(url, function(req, res, data) { callback(null, JSON.parse(data).entities[0]['file-metadata']['content-length']); }); } ], function(err, contentLength) { request.get({ url: url, headers: { "Accept": "application/zip" } }).pipe(res); res.oldWriteHead = res.writeHead; res.writeHead = function(statusCode, reasonPhrase, headers) { res.header('Content-Length', contentLength); res.oldWriteHead(statusCode, reasonPhrase, headers); } }); }); app.listen(9000); 

原来这实际上是一个相当简单的解决方法:在响应中将transfer-encoding头设置为空string解决了问题:

 ... res.oldWriteHead = res.writeHead; res.writeHead = function(statusCode, reasonPhrase, headers) { res.header('Content-Length', contentLength); res.header('transfer-encoding', ''); // <-- add this line res.oldWriteHead(statusCode, reasonPhrase, headers); } ... 

这样做的原因是因为在做了一些挖掘之后 ,似乎transfer-encoding头代替了content-length (因为两者不能共存)。 恰巧我用来testing的客户端select分块传输编码,而不是内容长度。