Speziell für Node ist die Dokumentation für die http-Server-Komponente unter Ereignisverbindung sagt:
[Ausgelöst] wenn ein neuer TCP-Stream aufgebaut wird. [Der] Socket ist ein Objekt vom Typ net.Socket. Normalerweise werden Benutzer nicht auf dieses Ereignis zugreifen wollen. Unter Insbesondere wird der Socket keine lesbaren Ereignisse ausgeben, da der der Protokollparser an den Socket gebunden ist. Der Socket kann auch zugegriffen werden unter request.connection
.
Das bedeutet also request.connection
ist ein Socket und laut der Dokumentation gibt es tatsächlich eine socket.remoteAddress Attribut, das der Dokumentation zufolge lautet:
Die String-Darstellung der entfernten IP-Adresse. Zum Beispiel, 74.125.127.100" oder "2001:4860:a005::68".
Unter express ist das Request-Objekt ebenfalls eine Instanz des Node http-Request-Objekts, so dass dieser Ansatz weiterhin funktionieren sollte.
Unter Express.js hat die Anfrage jedoch bereits zwei Attribute: req.ip y req.ips
req.ip
Rückgabe der entfernten Adresse oder - wenn "trust proxy" aktiviert ist - der vorgelagerten Adresse.
req.ips
Wenn "Vertrauensvollmacht" es true
wird die "X-Forwarded-For"-IP-Adressliste geparst und ein Array zurückgegeben, andernfalls wird ein leeres Array zurückgegeben. Wenn der Wert zum Beispiel "client, proxy1, proxy2" wäre würde man das Array ["client", "proxy1", "proxy2"] erhalten, wobei "proxy2" der am weitesten nachgelagerte ist.
Es ist erwähnenswert, dass meines Wissens nach die Express req.ip
ist ein besserer Ansatz als req.connection.remoteAddress
da req.ip
enthält die tatsächliche Client-IP-Adresse (vorausgesetzt, der vertrauenswürdige Proxy ist in express aktiviert), während die andere die IP-Adresse des Proxys enthalten kann (falls vorhanden).
Das ist der Grund, warum die derzeit akzeptierte Antwort vorschlägt:
var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
En req.headers['x-forwarded-for']
ist das Äquivalent zu express req.ip
.