那么,我找到了一种方法来使用ipaddr.js module,我通过this answer找到它。该模块可用于检查IPv6地址是否为IPv4地址,如果是,则进行转换。例如:
var ip = require('ipaddr.js')
function cleanupAddress (str) {
// if it's a valid ipv6 address, and if its a mapped ipv4 address,
// then clean it up. otherwise return the original string.
if (ip.IPv6.isValid(str)) {
var addr = ip.IPv6.parse(str);
if (addr.isIPv4MappedAddress())
return addr.toIPv4Address().toString();
}
return str
}
console.log(cleanupAddress('1.2.3.4'));
console.log(cleanupAddress('::ffff:1.2.3.4'));
console.log(cleanupAddress('::ffff:102:304'));
console.log(cleanupAddress('0:0:0:0:0:ffff:1.2.3.4'));
console.log(cleanupAddress('::1'));
console.log(cleanupAddress('2001:0db8:85a3:0000:0000:8a2e:0370:7334'));
输出:
1.2.3.4
1.2.3.4
1.2.3.4
1.2.3.4
::1
2001:0db8:85a3:0000:0000:8a2e:0370:7334
这就是我要的。我不特别介意添加另一个依赖关系,所以这看起来不错。
假设模块正确实现,这应该提供完全支持任何形式的IPv4和IPv6兼容地址。
下面是好奇的一个更完整的测试:
var ip = require('ipaddr.js')
function test (str) {
console.log(str);
console.log(' IPv4.isValid:', ip.IPv4.isValid(str));
console.log(' IPv6.isValid:', ip.IPv6.isValid(str));
if (ip.IPv6.isValid(str)) {
var addr = ip.IPv6.parse(str);
console.log(' IPv6.parse.toString:', addr.toString());
console.log(' IPv6.isIPv4MappedAddress:', addr.isIPv4MappedAddress());
if (addr.isIPv4MappedAddress()) {
console.log(' IPv6.toIPv4Address.toString:', addr.toIPv4Address().toString());
}
}
}
test('1.2.3.4')
test('::ffff:1.2.3.4')
test('0:0:0:0:0:ffff:1.2.3.4')
test('::1')
test('2001:0db8:85a3:0000:0000:8a2e:0370:7334')
,输出:
1.2.3.4
IPv4.isValid: true
IPv6.isValid: false
::ffff:1.2.3.4
IPv4.isValid: false
IPv6.isValid: true
IPv6.parse.toString: ::ffff:102:304
IPv6.isIPv4MappedAddress: true
IPv6.toIPv4Address.toString: 1.2.3.4
0:0:0:0:0:ffff:1.2.3.4
IPv4.isValid: false
IPv6.isValid: true
IPv6.parse.toString: ::ffff:102:304
IPv6.isIPv4MappedAddress: true
IPv6.toIPv4Address.toString: 1.2.3.4
::1
IPv4.isValid: false
IPv6.isValid: true
IPv6.parse.toString: ::1
IPv6.isIPv4MappedAddress: false
2001:0db8:85a3:0000:0000:8a2e:0370:7334
IPv4.isValid: false
IPv6.isValid: true
IPv6.parse.toString: 2001:db8:85a3::8a2e:370:7334
IPv6.isIPv4MappedAddress: false