response.write - 它是从可写流还是从http.ServerResponse调用write方法?

4

我是node的新手。 在这样的设置中

server.on('request', function(request, response) {
  // the same kind of magic happens here!
});

我假设responsehttp.ServerResponse的实例。但我所阅读的某个教程表示:http.ServerResponseWritableStream
现在,可写流和 http.ServerResponse 都有写入方法;分别位于此处此处
我的问题是:当我调用 response.write 时,哪个版本的 write 被调用?是来自 http.ServerResponse 还是可写流?
1个回答

3

http.ServerResponse 实现了 stream.Writable 接口的一个版本,但它并没有继承其实际实现。因此,当你调用 response.write() 时,你实际上调用的是 http.ServerResponse.write() 而不是 stream.Writable.write()

类:http.ServerResponse

响应实现了可写流接口,但并未从中继承。

在内部,http.ServerResponse 实际上是一个 OutgoingMessage,它是一个 ,并提供了 write() 方法。如果将其与 stream.Writable.write() 的实现进行比较,它们处理数据的方式是不同的。

我也很想知道,如果使用自己的 write 进行实现,它会获得什么好处?(来自下面的评论)

作为不属于 Node.js 基金会的一员,我无法对其动机发表言论。但从设计的角度来看,实现 stream.Writable 接口为开发者提供了熟悉和通用的方法和事件。此外,http.ServerResponse 写入连接套接字(参见 OutgoingMessage._send()),而这并不是 stream.Writable.write() 的一部分。也许以下摘录可以帮助理解基金会的思考过程。

可写流

所有可写流都实现了 stream.Writable 类定义的接口。

尽管可写流的特定实例在各种方面可能不同,但所有可写流都遵循相同的基本使用模式。


"http.ServerResponse实现了可写流接口的一个版本,但并没有真正继承它。" --> 所以它是覆盖了它,这就是你的意思吗? - anon
接口是模仿的,但是Writable的实际实现是不同的。 - peteb
还是说Stream只是一个接口,意味着它没有实现自己的方法,而实现这个接口的类提供了那些方法的实现,比如write? - anon
@GiorgiMoniava,已经提供的http.ServerResponse.write()方法代码不足以证明它实际上没有调用stream.Writable.write()吗? - peteb
我还没有详细研究你提供的代码 - 我稍后会看一下。我也很好奇如果它使用自己的写入功能,实现可写流会有什么好处(我在最初的问题中强调了这一点,但没关系)。 - anon
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接