node.js - 如何将客户端的正确 IP 地址获取到托管在 Heroku 上的 Node socket.io 应用程序中?

标签 node.js heroku socket.io

我最近在 Heroku 上使用 Express 和 socket.io 托管了我的第一个 Node 应用程序,需要找到客户端的 IP 地址。到目前为止,我已经尝试了 socket.manager.handshaken[socket.id].addresssocket.handshake.addresssocket.connection.address ,两者都没有给出正确的地址。

应用程序:http://nes-chat.herokuapp.com/ (还包含指向 GitHub 存储库的链接)

查看已连接用户的 IP:http://nes-chat.herokuapp.com/users

有人知道问题出在哪里吗?

最佳答案

客户端 IP 地址在 X-Forwarded-For HTTP header 中传递。我没有测试过,但它 looks like socket.io already takes this into account在确定客户端 IP 时。

您也应该可以自己获取,这里是 guide :

function getClientIp(req) {
  var ipAddress;
  // Amazon EC2 / Heroku workaround to get real client IP
  var forwardedIpsStr = req.header('x-forwarded-for'); 
  if (forwardedIpsStr) {
    // 'x-forwarded-for' header may return multiple IP addresses in
    // the format: "client IP, proxy 1 IP, proxy 2 IP" so take the
    // the first one
    var forwardedIps = forwardedIpsStr.split(',');
    ipAddress = forwardedIps[0];
  }
  if (!ipAddress) {
    // Ensure getting client IP address still works in
    // development environment
    ipAddress = req.connection.remoteAddress;
  }
  return ipAddress;
};

关于node.js - 如何将客户端的正确 IP 地址获取到托管在 Heroku 上的 Node socket.io 应用程序中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14382725/

相关文章:

node.js - 我如何在nodejs中获取docsign访问 token 来签署文档

node.js - 如何使用 sinon stub require ('firebase-admin' ).auth().getUserByEmail() ?

ruby-on-rails - 在 Heroku 上预编译 Assets 时如何普遍跳过数据库接触

ruby-on-rails - 如何在heroku Rails应用程序上更新seed.rb

node.js - Socket.io 和负载均衡器

javascript - 将自定义对象列表从服务器发送到客户端

javascript - 如何使用 mustache.js 验证 mustache 模板?

node.js - 向 uber sandbox api 发出请求不会改变任何内容

ruby-on-rails - Heroku 上的偶尔 Postgres 错误:无法将主机名 "<pg URL>"转换为地址:名称或服务未知(PG::错误)

javascript - 全局变量不在所有 Phaser 状态下更新