HTTP 文件服务器和 .writeHead 方法

HTTP File Servers and the .writeHead method

本练习的目标是创建一个 HTTP 服务器,为它收到的每个请求提供相同的文本文件。这是我的代码。它不起作用。

   var http = require ('http');
    var fs = require ('fs');
    var port = process.argv[2];
    var file = process.argv[3];
    var bl = require ('bl');

var server = http.createServer(function (request, response) {
    var stream = fs.createReadStream(file);
    var streamPipe = stream.pipe(response);
    response.write(streamPipe);
    });

server.listen(port);

我检查了正确的答案,那就是将以下代码放在函数的第一行,并删除我的 response.write() 方法:

response.writeHead(200, { 'content-type': 'text/plain' }); 

而不是我的代码,我认为它将将从请求流传输的数据写入响应流(第 10 行):

response.write(streamPipe)

没看懂。在使用 .createReadStream 方法建立流之后,不应该 response.writeHead 去吗?

我用 response.write() 发送的不是已经存在的数据吗?我想要这个 return 一个字符串而不是一个对象,但是参数必须首先是一个字符串,否则它不起作用。 toString() 方法 returns [object Object].

谁能解释一下 writeHead 方法的参数,以及为什么它先于其他方法?

我意识到这是一个很重要的问题。我是节点的新手,学习起来真的很兴奋,但我发现它很难理解。我有非常基本的 Java 脚本经验,还有一些 Java,所以我很感谢对有抱负的 node.js 开发人员的所有帮助。

每个 HTTP 响应都包含三个内容:状态、headers 和内容(可以为空)。

Status 仅表示响应的状态,例如200 OK404 Not Found500 Internal Server Error

Headers 是 key: value 对的序列,其中包含有关响应的各种元数据,例如 Content-Type: text/plainContent-Length: 123456。其中一些是强制性的,例如 Content-Length(实际上有一种情况不是,即分块编码),而另一些则不是。

最后内容只是一个字节序列。

此外,这正是 HTTP 响应流中这些内容的顺序。首先是状态,然后是 headers,最后是内容。

所以你总是首先调用 response.writeHead 方法,因为这个方法将状态和 headers 都发送给客户端。它接受一对 (status_code, headers_object) 作为参数,其中 status_code 只是一个数字, headers_object 是一个 object {key1: value1, key2: value2} 将被转换为 headers 序列.

最后 response.write 方法将一大块内容发送到客户端。它接受一个字符串作为参数。

在此处阅读有关响应方法的更多信息:https://nodejs.org/api/http.html#http_response_write_chunk_encoding_callback

请注意,您没有在您的示例中明确使用 response.write 方法,因为 stream.pipe(response) 会在后台为您执行此操作。读这个:

https://nodejs.org/api/stream.html#stream_readable_pipe_destination_options