You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何知晓访问本地Express服务器的设备并获取其私有IP?

获取Express应用的访问设备及私有IP方法

嘿,这个需求很实用!我来给你一步步拆解怎么实现——完全可以获取同一WiFi下访问你Express应用的设备私有IP,还能清晰记录哪些设备来过。

第一步:获取客户端的私有IP

Express的请求对象(req)里已经内置了客户端的IP信息,分两种场景处理:

直接运行Express(无反向代理)

如果你的Express服务器直接对外暴露(没用到Nginx这类代理),可以通过这两个属性拿到IP:

  • req.ip:Express预处理后的客户端IP,格式更友好
  • req.connection.remoteAddress:原始连接IP,可能返回IPv6格式(比如::1代表本地,::ffff:192.168.0.101这种是映射后的IPv4地址)

有反向代理的情况(可选)

如果你的Express放在代理后面,得先让Express信任代理,才能拿到真实客户端IP:

// 在Express初始化时添加
app.set('trust proxy', true);

配置后req.ip就会返回真实的私有IP了。

统一处理IP格式

为了避免IPv6格式的干扰,可以写个小函数提取纯净的IP:

function getRealClientIp(req) {
  let ip = req.ip || req.connection.remoteAddress;
  // 处理IPv6包裹的IPv4地址(比如::ffff:192.168.0.100)
  if (ip.startsWith('::ffff:')) {
    ip = ip.slice(7);
  }
  return ip;
}

第二步:记录访问日志

接下来要把每次访问的IP、时间、请求路径等信息存下来,这里提供两种简单方案:

1. 内存存储(适合临时查看)

用一个数组实时存储访问记录,重启服务器后会清空:

// 全局存储访问日志
const accessRecords = [];

// 全局中间件,每个请求都会触发
app.use((req, res, next) => {
  const clientIp = getRealClientIp(req);
  const visitTime = new Date().toLocaleString();
  const requestPath = req.originalUrl;

  // 存入访问记录
  accessRecords.push({
    ip: clientIp,
    time: visitTime,
    path: requestPath
  });

  next(); // 继续处理后续请求
});

2. 文件存储(持久化保存)

如果需要重启服务器后还能查看历史记录,可以把日志写入文件:

const fs = require('fs');
const path = require('path');
const logFilePath = path.join(__dirname, 'access.log');

app.use((req, res, next) => {
  const clientIp = getRealClientIp(req);
  const visitTime = new Date().toISOString();
  const requestPath = req.originalUrl;

  // 拼接日志内容
  const logLine = `[${visitTime}] IP: ${clientIp} | 请求路径: ${requestPath}\n`;

  // 追加写入文件
  fs.appendFile(logFilePath, logLine, (err) => {
    if (err) console.error('写入日志失败:', err);
  });

  next();
});

第三步:查看访问记录

可以做一个简单的路由来查看记录,记得加个基础权限控制,避免外人随便访问:

app.get('/access-logs', (req, res) => {
  // 只允许本地IP访问日志页面
  const localIps = ['::1', '127.0.0.1'];
  if (!localIps.includes(getRealClientIp(req))) {
    return res.status(403).send('无权访问此页面');
  }

  // 内存存储的话,直接返回JSON
  res.json(accessRecords);

  // 文件存储的话,读取文件返回格式化内容
  // fs.readFile(logFilePath, 'utf8', (err, data) => {
  //   if (err) return res.status(500).send('读取日志失败');
  //   res.send(`<pre>${data}</pre>`);
  // });
});

额外注意事项

  • 同一WiFi下的设备IP都是路由器分配的私有IP段(比如192.168.x.x、10.x.x.x),你记录到的就是这些地址
  • 如果设备开启了浏览器隐私模式或使用VPN,可能无法获取真实私有IP,但普通场景下都能正常获取
  • 日志文件会随时间变大,建议定期清理,或者使用winston、morgan这类专业日志库做更规范的日志管理

内容的提问来源于stack exchange,提问作者Saurabh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:23:55