Node.js 如何在节点中拦截传出的tcp消息?

Node.js 如何在节点中拦截传出的tcp消息?,node.js,sockets,tcp,node-streams,Node.js,Sockets,Tcp,Node Streams,如何编写一个简单的截取消息的流 例如,假设我想记录(或最终转换)用户的socket.write(…)调用通过网络发送的消息 以下是尝试执行此操作的最小程序: const net = require('net'); const stream = require('stream'); const socket = new net.Socket(); const transformer = new stream.Transform({ transform(chunk,e,cb){

如何编写一个简单的截取消息的流

例如,假设我想记录(或最终转换)用户的socket.write(…)调用通过网络发送的消息

以下是尝试执行此操作的最小程序:

const net    = require('net');
const stream = require('stream');

const socket = new net.Socket();

const transformer = new stream.Transform({
  transform(chunk,e,cb){
    console.log("OUT:"+chunk.toString());
    cb();
  }});
//const client = socket.pipe(transformer); // <= prints "OUT:" on client, but nothing on server
const client = transformer.pipe(socket); // <= prints nothing on client, but "hello world" on server

socket.on('data', (data)=>{ console.log("IN:"+data.toString()); });
socket.connect(1234, 'localhost', ()=>{ client.write("hello world"); });
const net=require('net');
const stream=require('stream');
const socket=新的net.socket();
const transformer=new stream.Transform({
转换(块、e、cb){
log(“OUT:+chunk.toString());
cb();
}});
//const client=socket.pipe(transformer);//{client.write(“hello world”);});
当我执行socket.pipe(transformer)时,客户机打印“OUT:”(如我所愿),但实际上并不向服务器发送任何内容。当我交换管道位置transformer.pipe(socket)时,除了消息被发送到服务器之外,没有任何东西被打印到客户端

虽然这里没有列出,但我也尝试使用可写流,它会在客户端打印消息,但它从未发送到服务器(如果我在可写流中执行this.push(…),它似乎仍然不会发送到服务器)

我错过了什么


编辑:为清晰起见重新格式化代码并更新文本

您没有从流中写入任何数据

您需要
this.push(chunk)
或将对
cb
的调用更改为
cb(null,chunk)


看起来我需要更改以下行

socket.connect(1234, 'localhost', ()=>{ client.write("hello world"); });
对此

socket.connect(1234, 'localhost', ()=>{ transformer.write("hello world"); });

这是基于@Mr.Phoenix的评论。我希望.pipe()返回一个我可以使用的新流。我相信Java的netty框架就是这样做的,我一直希望节点流也能以同样的方式工作。

请重新格式化代码,这一行是不可读的。你是说TCP连接的代理?@Phoenix先生,谢谢,现在应该是更好的格式了。这是一个日志记录程序。当有人调用socket.write(数据)时,我想将数据打印到屏幕上。我真正的问题更复杂,但我需要弄清楚如何将处理逻辑封装在一个可以放入的流中。管道(…)我很难理解您的代码片段,您使用transform就像使用TCP客户端一样,但您只将其管道回服务器,并在向其写入数据时期望它作为数据事件的输出,cb看起来不完整,它应该与下面的答案类似
cb(null,chunk)
,您可以使用
transformer.pipe(socket.pipe(client)
但是,无论是谁试图阅读本文,这都没有任何意义。请尝试阅读以更好地理解流,并可能使用dnode软件包,这样可以减少此类任务的复杂性。@Phoenix先生,如果您将此作为回答,我将接受。看起来我需要在transformer上调用.write(),而不是客户端。你的信息让我想到了那个改变。那似乎没什么区别。此外,在上面的示例中,我的数据很好地到达了服务器,只是没有像我预期的那样被截获(它没有在客户端上打印“OUT:”。