2017-06-13 3 views
0

Ich kann nicht scheinen, net.Socket.write zu überschreiben. Das folgende Beispiel ist nicht mein tatsächlicher Anwendungsfall, sondern ein verkleinertes, lauffähiges Beispiel zur Demonstration des Problems.Kann nicht überschrieben werden 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"); 
}); 

Erwartete Ausgabe:

gesendet ...

Buchse Ending ...

Server empfangenen Daten: Testschreib

Testende

tatsächliche Ausgang:

Ending Buchse ...

Server Daten empfangen: Testschreib

Testende

Die überschrieben Ende Funktion, wie Sie genannt wird kann aus der Ausgabe sehen, aber nur das Original net.Socket.write wird jemals aufgerufen. Ich fühle mich wie ich etwas fehlt ...

Antwort

1

Ich denke, es liegt daran, of this code bei der Umsetzung von net.Socket.connect():

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

Mögliche Abhilfe:

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

Wow, das war schnell! Vielen Dank! –

Verwandte Themen