当前位置: 首页 > 面试题库 >

Node.js:分块传输编码

顾斌
2023-03-14
问题内容

代码是否有效的HTTP / 1.1?

var fs = require('fs')
var http = require('http')

var buf=function(res,fd,i,s,buffer){
 if(i+buffer.length<s){
  fs.read(fd,buffer,0,buffer.length,i,function(e,l,b){
   res.write(b.slice(0,l))
   //console.log(b.toString('utf8',0,l))
   i=i+buffer.length
   buf(res,fd,i,s,buffer)
  })
 }
 else{
  fs.read(fd,buffer,0,buffer.length,i,function(e,l,b){
   res.end(b.slice(0,l))
   fs.close(fd)
  })
 }
}

var app = function(req,res){
 var head={'Content-Type':'text/html; charset=UTF-8'}
 switch(req.url.slice(-3)){
  case '.js':head={'Content-Type':'text/javascript'};break;
  case 'css':head={'Content-Type':'text/css'};break;
  case 'png':head={'Content-Type':'image/png'};break;
  case 'ico':head={'Content-Type':'image/x-icon'};break;
  case 'ogg':head={'Content-Type':'audio/ogg'};break;
  case 'ebm':head={'Content-Type':'video/webm'};break;
 }
 head['Transfer-Encoding']='chunked'
 res.writeHead(200,head)
 fs.open('.'+req.url,'r',function(err,fd){
  fs.fstat(fd,function(err, stats){
   console.log('.'+req.url+' '+stats.size+' '+head['Content-Type']+' '+head['Transfer-Encoding'])
   var buffer = new Buffer(100)
   buf(res,fd,0,stats.size,buffer)
  })
 })
}

http.createServer(app).listen(8000,"127.0.0.1")
console.log('GET http://127.0.0.1:8000/appwsgi/www/index.htm')

我认为我在这里违反HTTP / 1.1?文本文件似乎确实可以正常工作,但这可能是偶然的。我的标题是“ 200 OK”还是需要为“ 100”?一个头足够吗?


问题答案:

如果要进行分块传输编码,则实际上需要设置该标头:

Transfer-Encoding: chunked

您可以从google返回的标头中看到该标头,该标头会对主页以及最可能的其他页面进行分块传输:

HTTP/1.1 200 OK
Date: Sat, 04 Jun 2011 00:04:08 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
Set-Cookie: PREF=ID=f9c65f4927515ce7:FF=0:TM=1307145848:LM=1307145848:S=fB58RFtpI5YeXdU9; expires=Mon, 03-Jun-2013 00:04:08 GMT; path=/; domain=.google.com
Set-Cookie: NID=47=UiPfl5ew2vCEte9JyBRkrFk4EhRQqy4dRuzG5Y-xeE---Q8AVvPDQq46GYbCy9VnOA8n7vxR8ETEAxKCh-b58r7elfURfiskmrOCgU706msiUx8L9qBpw-3OTPsY-6tl; expires=Sun, 04-Dec-2011 00:04:08 GMT; path=/; domain=.google.com; HttpOnly
Server: gws
X-XSS-Protection: 1; mode=block
Transfer-Encoding: chunked

编辑 Yikes,读起来太复杂了:

var app = function(req,res){
 var head={'Content-Type':'text/html'}
 switch(req.url.slice(-3)){
  case '.js':head={'Content-Type':'text/javascript'};break;
  case 'css':head={'Content-Type':'text/css'};break;
  case 'png':head={'Content-Type':'image/png'};break;
  case 'ico':head={'Content-Type':'image/x-icon'};break;
  case 'ogg':head={'Content-Type':'audio/ogg'};break;
  case 'ebm':head={'Content-Type':'video/webm'};break;
 }
 res.writeHead(200,head)
 var file_stream = fs.createReadStream('.'+req.url);
 file_stream.on("error", function(exception) {
   console.error("Error reading file: ", exception);
 });
 file_stream.on("data", function(data) {
   res.write(data);
 });
 file_stream.on("close", function() {
   res.end();
 });
}

到了那里,一个不错的流缓冲供您编写。 这是我写的一篇博客文章,介绍了几种读取文件的方法。
我建议您仔细研究一下,以便您可以了解如何在节点的异步环境中更好地处理文件。



 类似资料:
  • 我们正在尝试让Flask web服务正常工作,但是流式帖子出现了一些问题,例如,当标题包含传输编码时:chunked。 似乎默认的flask不支持HTTP 1.1。这有什么办法吗? 我们正在运行此命令: 违反此代码: 以下是旋度输出: 这是Flask服务器的输出:

  • 问题内容: 由于我在更常规的基础上使用WebSocket连接,因此我对事物的工作原理很感兴趣。因此,我花了一段时间研究无休止的规范文档,但到目前为止,我还没有真正找到有关 分块传输流本身的 任何信息。 WebSocket协议将其称为 数据帧 (描述了纯数据流,因此也称为 非控制帧 )。据我了解,规范没有定义最大长度,也没有定义MTU(最大传输单位)值,这反过来意味着单个WebSocket数据帧可以

  • 我正在尝试以分块模式发送数据。正确设置所有标题,并相应地对数据进行编码。浏览器将我的响应识别为分块响应,接受标题并开始接收数据。 我希望浏览器会更新每个接收到的区块的页面,而不是等到所有区块都被接收,然后显示它们。这是预期的行为吗? 我希望看到每个块在收到后立即显示。使用时,每个块在收到后立即显示。为什么GUI浏览器不会发生同样的情况?他们是否在使用某种缓冲/缓存? 我将标头设置为,所以不确定它是

  • 如能提供任何协助,将不胜感激。

  • 我使用SpringWebFlux反应式库创建了大量RESTAPIendpoint。我现在面临的问题是,SpringWebFlux返回的响应具有传输编码:分块HTTP头。因为哪个客户端应用程序使用像Axios这样的库(https://github.com/axios/axios)浏览器javascript中基于promise的HTTP客户端失败。如何关闭传输编码:分块? Spring webflux

  • 问题内容: 我想知道是否可以使用Node.js将数据从服务器流式传输到客户端。我想将单个AJAX请求发布到Node.js,然后将连接保持打开状态并将数据连续流式传输到客户端。客户端将收到此流并不断更新页面。 更新: 更新-我无法使其正常工作。在你打电话之前不发送。我建立了一个示例程序来实现此目的: Node.js: HTML: 使用这种方法,我打电话之前什么都没拿回来。这是否可能,或者我应该使用长