本练习的目标是创建一个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()发送现有数据吗?我希望这返回一个字符串而不是一个对象,但参数必须首先是一个字符串,否则它不起作用。 toString()方法返回[object Object]。
有人可以解释一下writeHead方法的参数,以及为什么它会先于其他方法?
我意识到这是一个有问题的问题。我是节点的新手,很高兴学习,但我发现它很难理解。我有非常基本的JavaScript经验和一些Java,所以我感谢有抱负的node.js开发人员的所有帮助。
答案 0 :(得分:0)
每个HTTP响应都有三个:状态,标题和内容(可以为空)。
状态只是告诉响应状态,例如200 OK
,404 Not Found
,500 Internal Server Error
等
标头是一系列key: value
对,其中包含有关响应的各种元数据,如Content-Type: text/plain
或Content-Length: 123456
。其中一些是强制性的,如Content-Length
(实际上有一种情况,即它不是,即分块编码),而其他则不是。
最后内容只是一个字节序列。
而且,这正是HTTP响应流中那些事情的顺序。首先是状态,然后是标题,最后是内容。
因此,您将始终首先调用response.writeHead
方法,因为此方法会将状态和标头发送到客户端。它接受一对(status_code, headers_object)
作为参数,其中status_code
只是一个数字,而headers_object
是一个对象{key1: value1, key2: value2}
,它将转换为标题序列。
最后,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