HTTP文件服务器和.writeHead方法

时间:2016-03-20 00:30:20

标签: javascript node.js http server response.write

本练习的目标是创建一个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开发人员的所有帮助。

1 个答案:

答案 0 :(得分:0)

每个HTTP响应都有三个:状态,标题和内容(可以为空)。

状态只是告诉响应状态,例如200 OK404 Not Found500 Internal Server Error

标头是一系列key: value对,其中包含有关响应的各种元数据,如Content-Type: text/plainContent-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