В частности, для узла документация для компонента http-сервера в разделе подключения к событиям гласит:
[Срабатывает] при создании нового потока TCP. Сокет [] является объектом типа net.Socket. Обычно пользователи не хотят получать доступ к этому событию. В частности, сокет не будет генерировать читаемые события из-за того, как синтаксический анализатор протокола присоединяется к сокету. Сокет также может быть доступен по адресу request.connection
.
Таким образом, это означает, что request.connection
это сокет, и, согласно документации, действительно есть атрибут socket.remoteAddress, который согласно документации:
Строковое представление удаленного IP-адреса. Например, '74 .125.127.100 'или' 2001: 4860: a005 :: 68 '.
В экспрессе объект запроса также является экземпляром объекта запроса http узла, поэтому этот подход все еще должен работать.
Однако в Express.js запрос уже имеет два атрибута: req.ip и req.ips
req.ip
Возврат удаленного адреса или, если «доверенный прокси» включен - адрес обратного потока.
req.ips
Когда «доверенный прокси» имеет значение true
, проанализируйте список IP-адресов «X-Forwarded-For» и верните массив, в противном случае возвращается пустой массив. Например, если бы значением было «client, proxy1, proxy2», вы бы получили массив [«client», «proxy1», «proxy2»], где «proxy2» - самый дальний нисходящий поток.
Возможно, стоит упомянуть, что, по моему мнению, Express req.ip
является более подходящим подходом, чем req.connection.remoteAddress
, поскольку он req.ip
содержит фактический ip клиента (при условии, что доверенный прокси-сервер включен в Express), тогда как другой может содержать IP-адрес прокси-сервера (если есть). один).
Вот почему в настоящее время принятый ответ предполагает:
var ip = req.headers['x-forwarded-for'] ||
req.connection.remoteAddress;
req.headers['x-forwarded-for']
Будет эквивалентна экспресс req.ip
.