2017-01-29 58 views

回答

2

那麼,我找到了一種方法來使用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