检索客户端请求IP地址

时间:2018-03-13 13:41:38

标签: javascript node.js express request ip

这篇文章不再是一个问题了;我只是想发布这个以帮助其他人将来避免浪费时间。

目标:检索客户端IP地址,并根据IP中的某个八位字节设置一些特定值。

我正在为我的公司开发一个反应式网络应用程序,需要支持三个设施。课程的三个位置存在于不同的地理区域,并且具有略微不同的IP模式。

我需要根据客户端IP的八位字节值设置一些会话标识符。为此,我做了以下步骤。

  1. 为用户初次访问app设置快速路线。
  2. 获取客户端IP并存储在const / var。
  3. "."分发IP字符串。
  4. 执行 If / Then Switch 以确定所需八位字节的值。
  5. 在匹配条件下设置一些会话/逻辑。
  6. 感谢express,req对象包含一个带有请求IP地址值的ip密钥。我们可以利用这个或其他第三方库来获取所需的信息。当然有更好/更安全的方法来做到这一点,但这是我研究和设置的一种简单方法。非常感谢社区帮助我解决我的问题。

        apiRouter.route('/test')
    
        .get((req, res) => {
            const request_ip = req.ip;      // Returns string like ::ffff:192.168.0.1
            const ip_array = request_ip.split('.')      // Returns array of the string above separated by ".". ["::ffff:192","168","0","1"]
    
            // The switch statement checks the value of the array above for the index of 2. This would be "0"
            switch(ip_array[2]) {
                case('0'):
                    res.json({'request-ip':ip_array, 'location':'Location A'});
                    break;
                case('1'):
                    res.json({'request-ip':ip_array, 'location':'Location B'});
                    break;
                case('2'):
                    res.json({'request-ip':ip_array, 'location':'Location C'});
                    break;
                default:
                    res.json({'request-ip':ip_array, 'location':'Default Location'});
            }
    
        })
    

    我的一个主要问题是我在我的本地笔记本电脑上进行开发。我的节点服务器在这里运行快递。我也试图从我的本地机器上获取我的请求。这没有意义,因为我不断回复"::1"作为我的请求IP。困惑,我做了很多研究,最后发现它是一个明显的PEBKAC问题。感谢nikoss在this帖子中,它在全世界都很有意义。

4 个答案:

答案 0 :(得分:1)

您可以通过从开放IP

获取此信息来获取此信息

https://api.ipdata.co/

fetch("https://api.ipdata.co")
  .then(response => {
    return response.json();
   }, "jsonp")
  .then(res => {
    console.log(res.ip)
  })
  .catch(err => console.log(err))

答案 1 :(得分:0)

https://api.ipdata.co似乎不再起作用,即使指定了键也是如此。我最终使用了(打字稿):

private getMyIp() {
  fetch('https://api.ipify.org?format=json').then(response => {
    return response.json();
  }).then((res: any) => {
    this.myIp = _.get(res, 'ip');
  }).catch((err: any) => console.error('Problem fetching my IP', err))
}

这是其他服务的良好参考:https://ourcodeworld.com/articles/read/257/how-to-get-the-client-ip-address-with-javascript-only

答案 2 :(得分:0)

这有效!

async componentDidMount() {
      
    const response = await fetch('https://geolocation-db.com/json/');
    const data = await response.json();
    this.setState({ ip: data.IPv4 })
    alert(this.state.ip)

}

在 jsx 中使用它作为

{this.state.ip}

答案 3 :(得分:-1)

如果https://api.ipdata.co不起作用,则可以使用geolocation-db.com/json。地理位置的优势还为您提供了其他重要的价值,例如 latitude, longitude, country, state, zip

fetch(`https://geolocation-db.com/json/`)
        .then(res => res.json())
  

您可以打印res.json()来查看它们