如何知晓访问本地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
相关产品推荐
相关产品推荐

