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 OK
、404 Not Found
、500 Internal Server Error
等
Headers 是 key: value
对的序列,其中包含有关响应的各种元数据,例如 Content-Type: text/plain
或 Content-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
本练习的目标是创建一个 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 OK
、404 Not Found
、500 Internal Server Error
等
Headers 是 key: value
对的序列,其中包含有关响应的各种元数据,例如 Content-Type: text/plain
或 Content-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