【问题标题】:How to send a http response without using http module in node.js?如何在 node.js 中不使用 http 模块发送 http 响应?
【发布时间】:2012-01-17 08:43:54
【问题描述】:

我需要在 node.js 中实现一个 HTTP 服务器而不使用 http 模块。多么有趣! 我在发送响应套接字时遇到问题。

我正在尝试获取文件,因此我的代码如下所示:

fileStream = fs.createReadStream('example.jpg');
fileStream.on("end", function (close) {    
    var str = "HTTP/1.1 200 OK\r\Content-Type: image/jpeg\r\n" //and some more headers.
    socket.write(str);
    socket.pipe(fileStream);
    socket.end("\r\n");
});

我错过了什么?

我当然也是用net模块来获取socket和fs的。

【问题讨论】:

  • 有点好奇,你为什么要在NOde中实现一个HTTP服务器而不是使用默认的?
  • 因为这就是教授想要的:)
  • 我之所以问,是因为还有 3-4 个人有类似的问题,我注意到这也是他们的作业:))
  • @Nili:您还应该对有用且清晰的答案投赞成票。

标签: node.js fs


【解决方案1】:

您的代码有两个主要问题。

  • 响应格式为标头,后跟两组“\r\n”,然后是内容。您的 end() 调用中的“\r\n”应该在str 中。您还缺少第一个“\r\n”中的“n”。
  • 您正在尝试通过管道传输 readstream 的内容,这很好,但是您在 steam 的 end() 内部执行所有这些操作,因此管道没有任何东西可以发送,因为数据已经全部发出。

改用这样的方法。创建读取流,发送响应和管道,然后休息。

var str = "HTTP/1.1 200 OK\r\nContent-Type: image/jpeg\r\n\r\n";
socket.write(str);
var fileStream = fs.createReadStream('example.jpg');
fileStream.pipe(socket);

【讨论】:

  • 另外,你可能想要一个 writeStream 而不是 readStream :)
  • 他正在读取文件 readstream 并通过管道传输到套接字,所以我认为它是有道理的。
  • 我的错,我读错了问题。但是这段代码仍然是错误的。读流-> 写流。 fileStream.pipe(socket);
猜你喜欢
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 2018-01-05
  • 2019-02-16
  • 2020-06-23
  • 2014-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多