/** * 与 requestLog 相同:本地 ip2region.xdb,仅支持 IPv4。 */ const path = require('path') const ipSearcher = require('../../plugin/ip2region') let _searcher = null function getSearcher() { if (!_searcher) { _searcher = ipSearcher.newWithFileOnly(path.join(__dirname, '../../plugin/ip2region/ip2region.xdb')) } return _searcher } /** * @param {string|null|undefined} ip * @returns {Promise} 可读属地,失败或非法为「未知」 */ async function lookupIpv4Region(ip) { const s = String(ip || '').trim() if (!s || !ipSearcher.isValidIp(s)) return '未知' try { const r = await getSearcher().search(s) const raw = r?.region if (!raw || typeof raw !== 'string') return '未知' return raw.split('|').filter(Boolean).join(' · ') } catch { return '未知' } } /** * 从 server 字段形如 host:port 取 IP */ function extractIpFromServer(server) { if (!server || typeof server !== 'string') return null const host = server.split(':')[0].trim() return ipSearcher.isValidIp(host) ? host : null } module.exports = { lookupIpv4Region, extractIpFromServer }