Especialmente para o nó, a documentação para o componente do servidor http, em conexão de evento, diz:
[Disparado] quando um novo fluxo TCP é estabelecido. [O] soquete é um objeto do tipo net.Socket. Normalmente, os usuários não desejam acessar este evento. Em particular, o soquete não emitirá eventos legíveis devido à maneira como o analisador de protocolo é anexado ao soquete. O soquete também pode ser acessado em request.connection
.
Então, isso significa request.connection
é um soquete e, de acordo com a documentação, existe realmente um atributo socket.remoteAddress que, de acordo com a documentação, é:
A representação em cadeia do endereço IP remoto. Por exemplo, '74 .125.127.100 'ou' 2001: 4860: a005 :: 68 '.
Sob express, o objeto de solicitação também é uma instância do objeto de solicitação http do Nó, portanto essa abordagem ainda deve funcionar.
No entanto, no Express.js, a solicitação já possui dois atributos: req.ip e req.ips
req.ip
Retorne o endereço remoto ou quando o "proxy de confiança" estiver ativado - o endereço upstream.
req.ips
Quando "trust proxy" for true
, analise a lista de endereços IP "X-Forwarded-For" e retorne uma matriz, caso contrário, uma matriz vazia será retornada. Por exemplo, se o valor fosse "cliente, proxy1, proxy2", você receberia a matriz ["cliente", "proxy1", "proxy2"] em que "proxy2" é o mais a jusante.
Vale ressaltar que, no meu entender, o Express req.ip
é uma abordagem melhor do que req.connection.remoteAddress
, uma vez quereq.ip
contém o IP do cliente real (desde que o proxy confiável seja ativado no express), enquanto o outro pode conter o endereço IP do proxy (se houver 1).
Essa é a razão pela qual a resposta atualmente aceita sugere:
var ip = req.headers['x-forwarded-for'] ||
req.connection.remoteAddress;
O req.headers['x-forwarded-for']
será o equivalente a express req.ip
.