CNode

http server response 客户端报出ERR_INVALID_CHUNKED_ENCODING

问答
LLEOxiaoD发布于12 年前最后回复12 年前8 回复13727 浏览0 收藏

我先这样写

  fs.createReadStream(p).pipe(res);

没有问题,但是

  var readable = fs.createReadStream(p);
  readable.on("data", function(data){
  	res.write(data);
  });
  readable.on("end", function(){
  	// write response head
  	res.writeHead(200, {
  		"Content-Type": "text/html",
  		"Transfer-Encoding": "chunked"
  	});
  	res.end();
  });
  readable.on("error", function(){
  	res.statusCode = 500;
  	res.end("500 Internal Error");
  });

这样的话客户端就报出ERR_INVALID _CHUNKED_ENCODING 怎么回事呢?

查看回复

回复 (8)

L
LEOxiaoD#2·12 年前

加了个buffer 问题没有了 谁能解释下是为什么吗 谢啦

  var readable = fs.createReadStream(p);
  var buffer = new Buffer("");
  
  readable.on("data", function(data){
      // res.write(data);
  	buffer = Buffer.concat([buffer, data]);
  });
  
  readable.on("end", function(){
  	// write response head
  	res.writeHead(200, {
  		"Content-Type": "text/html",
  		"Transfer-Encoding": "chunked"
  	});
  	res.end(buffer);
  });
  
  readable.on("error", function(){
  	res.statusCode = 500;
  	res.end("500 Internal Error");
  });
M
MiguelValentine#3·12 年前

var readstream = fs.createReadStream(filepath,{encoding:'binary'}); res.write(data,'binary'); res.end()

L
LEOxiaoD#4·12 年前
M
MiguelValentine#5·12 年前

ON(data)会被多次触发。这么写

  var datax='';
  var readable = fs.createReadStream(p,'binary');
  readable.on("data", function(data){
      datax +=data;
  });
  
  readable.on("end", function(){
      // write response head
      res.writeHead(200, {"Content-Type": "text/html" });
      res.write(datax,'binary');
	  res.end();
  });
  
  readable.on("error", function(){
      res.statusCode = 500;
      res.end("500 Internal Error");
  });
L
LEOxiaoD#6·12 年前
引用 MiguelValentineON(data)会被多次触发。这么写 ``` var datax=''; var readable = fs.createReadStream(p,'binary'); readable.on...

@MiguelValentine 恩 在第一条回复里我自己解决了这个问题 但是我想知道为什么要加个buffer,然后在end的时候一起传给浏览器

N
nodejser#7·12 年前

因为那个不能执行的代码是先发送响应的主体再发送的响应头,这个是不正确的,应该要先发送响应头再发送响应主体。

N
nodejser#8·12 年前

@LEOxiaoD 太客气了。

参与回复
登录后即可参与回复。登录