2017-06-13 123 views
0

我似乎无法重写net.Socket.write。下面的例子不是我真正的用例,而是一个缩小的,可运行的示例来演示这个问题。无法覆盖net.Socket.write

const net = require("net"); 

class UTF8Socket extends net.Socket { 
    constructor() { 
     super(); 
     this.setEncoding("utf8"); 
    } 

    write(data, cb) { 
     console.log("Sending..."); 
     super.write(data, "utf8", cb); 
    } 

    end(data) { 
     console.log("Ending socket..."); 
     super.end(data); 
    } 
} 

// Setup server 
const server = net.createServer(socket => { 
    socket.setEncoding("utf8"); 
    socket.on("data", (res) => console.log("Server received data:", res)); 
}); 
server.listen(8080, '127.0.0.1'); 

// Create a UTF8Socket and write to server 
const socket = new UTF8Socket(); 
socket.connect(8080, "127.0.0.1",() => { 
    socket.write("test write\n"); 
    socket.end("test end"); 
}); 

预期输出:

发送...

结束插座...

服务器接收到的数据:测试写入

测试结束

实际输出:

结束插座...

服务器接收到的数据:测试写入

测试结束

的覆盖端函数被调用,你可以从输出中看到,但只有原始的net.Socket.write被称为。我觉得我失去了一些东西......

回答

1

我想这是因为of this codenet.Socket.connect()实现:

if (this.write !== Socket.prototype.write) 
    this.write = Socket.prototype.write; 

可能的解决方法:

connect() { 
    let result = super.connect.apply(this, arguments); 
    this.write = UTF8Socket.prototype.write.bind(this); 
    return result; 
} 
+0

哇,这是快!谢谢! –