2017-06-13 120 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

哇,這是快!謝謝! –