Πώς να διορθώσετε το σφάλμα: listen EADDRINUSE κατά τη χρήση του nodejs;

Αν τρέξω έναν διακομιστή με τη θύρα 80 και προσπαθήσω να χρησιμοποιήσω το xmlHTTPrequest λαμβάνω αυτό το σφάλμα: Error: listen EADDRINUSE

Γιατί είναι πρόβλημα για το nodejs, αν θέλω να κάνω μια αίτηση, ενώ τρέχω έναν διακομιστή στη θύρα 80; Για τους webbrowsers δεν είναι πρόβλημα: μπορώ να σερφάρω στο διαδίκτυο, ενώ τρέχει ο διακομιστής.

Ο διακομιστής είναι:

  net.createServer(function (socket) {
    socket.name = socket.remoteAddress + ":" + socket.remotePort;
    console.log('connection request from: ' + socket.remoteAddress);
    socket.destroy();
  }).listen(options.port);

Και η αίτηση:

var xhr = new XMLHttpRequest();

xhr.onreadystatechange = function() {
    sys.puts("State: " + this.readyState);

    if (this.readyState == 4) {
        sys.puts("Complete.\nBody length: " + this.responseText.length);
        sys.puts("Body:\n" + this.responseText);
    }
};

xhr.open("GET", "http://mywebsite.com");
xhr.send();
Λύση

EADDRINUSE σημαίνει ότι ο αριθμός θύρας στον οποίο η listen() προσπαθεί να συνδέσει τον διακομιστή είναι ήδη σε χρήση.

Έτσι, στην περίπτωσή σας, πρέπει να λειτουργεί ήδη ένας διακομιστής στη θύρα 80.

Αν έχετε έναν άλλο διακομιστή ιστού που τρέχει σε αυτή τη θύρα, θα πρέπει να βάλετε το node.js πίσω από αυτόν τον διακομιστή και να το περάσετε μέσω proxy.

Θα πρέπει να ελέγξετε για το συμβάν listening ως εξής, για να δείτε αν ο διακομιστής ακούει πραγματικά:

var http=require('http');

var server=http.createServer(function(req,res){
    res.end('test');
});

server.on('listening',function(){
    console.log('ok, server is running');
});

server.listen(80);
Σχόλια (3)

Απλά για να σας ενημερώσουμε, το Skype μερικές φορές ακούει τη θύρα 80 και επομένως προκαλεί αυτό το σφάλμα αν προσπαθήσετε να ακούσετε τη θύρα 80 από το Node.js ή οποιαδήποτε άλλη εφαρμογή.

Μπορείτε να απενεργοποιήσετε αυτή τη συμπεριφορά στο Skype, αποκτώντας πρόσβαση στις επιλογές και κάνοντας κλικ στην επιλογή Advanced -> Connection -> Use port 80 (Untick this)

Υ.Γ. Αφού κάνετε αυτή την αλλαγή, μην ξεχάσετε να επανεκκινήσετε το Skype!

Σχόλια (5)

Έχω ξαναδεί αυτό το σφάλμα (στον κόμβο) με το http.client, και όπως θυμάμαι, το πρόβλημα είχε να κάνει με τη μη αρχικοποίηση του httpClient ή τον καθορισμό κακών επιλογών κατά τη δημιουργία του httpClient ή/και στην αίτηση url.

Σχόλια (1)