Node.js 不传送内容

Node.js does not pipe contents

我有一个简单的 Web 服务器,它应该发送一个文件。我从 another answer.

中获取了代码
#! /usr/bin/node

const FS     = require ('fs');
const HTTP   = require ('http');

const server = HTTP.createServer ();

server.on ('request', (request, response) => {
  switch (request.url) {
  case '/':
    switch (request.method) {
    case 'GET':
      console.log ("GET /");
      let stat = FS.statSync ('index.html');
      console.log (stat.size);
      response.writeHead (200, { 'Content-Type': 'text/html',
                                 'Content-Lenght': stat.size });
      let index = FS.createReadStream ('index.html', 'UTF-8');
      index.pipe (response);
      response.end ();
      return;
    }
    break;
  }
  response.writeHead (400, {});
  response.end ();
});

server.listen (8080);

当我尝试使用 curl 发送 GET 请求时,我没有收到任何内容。我的服务器报告,index.html 文件有 324 个字节:

$ ./server.js 
GET /
324

但是curl不显示内容。 header 包含内容长度,但缺少 body。

$ curl -v --noproxy \* http://localhost:8080/
[...]
* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET / HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.64.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< Content-Type: text/html
< Content-Lenght: 324
< Date: Sat, 21 Nov 2020 19:24:31 GMT
< Connection: keep-alive
< Transfer-Encoding: chunked
< 
* Connection #0 to host localhost left intact

我看起来好像连接在文件传输之前关闭了。这是错误吗?我该如何避免?

删除 response.end ();。在 .pipe() 开始工作之前,您过早地关闭了响应(它是异步的,因此它会随着时间的推移而完成,并且 returns 在完成之前)。

在默认配置中,.pipe() 将在完成后为您结束响应。

您还会注意到 the other answer 您从中汲取了这个想法并没有 response.end()