1. 程式人生 > >nodejs中獲取內網ip地址

nodejs中獲取內網ip地址

今天同事有個需求,希望用nodejs裡的web伺服器的對應的站點可以支援內網訪問,後來發現修改express裡的hostname屬性為自己的內網ip就可以了。但是問題是,我們的機器都是自動獲取內網ip,那麼這次寫死的hostname下次基本上就不能用了,於是我們想到了在nodejs裡動態獲取內網ip,並且把值賦給express的open方法就可以了,於是我按照這個思路開工了。

我們先了解怎麼獲取內網ip,網上的通用方法我試了下,在我機器裡是無效的,除錯了下才發現了它這個不是完全通用的,於是我針對公司這邊的內網環境做了修改。

網上通用的寫法:

var os = require('os');
function getLocalIP() {
    var map = [];
    var ifaces = os.networkInterfaces();
    console.log(ifaces);
    for (var dev in ifaces) {
        if (dev.indexOf('eth0') != -1) {
            var tokens = dev.split(':');
            var dev2 = null;
            if (tokens.length == 2) {
                dev2 = 'eth1:' + tokens[1];
            } else if (tokens.length == 1) {
                dev2 = 'eth1';
            }
            if (null == ifaces[dev2]) {
                continue;
            }
            // 找到eth0和eth1分別的ip
            var ip = null, ip2 = null;
            ifaces[dev].forEach(function(details) {
                if (details.family == 'IPv4') {
                    ip = details.address;
                }
            });
            ifaces[dev2].forEach(function(details) {
                if (details.family == 'IPv4') {
                    ip2 = details.address;
                }
            });
            if (null == ip || null == ip2) {
                continue;
            }
            // 將記錄新增到map中去
            if (ip.indexOf('10.') == 0 ||
                ip.indexOf('172.') == 0 ||
                ip.indexOf('192.') == 0) {
                map.push({"intranet_ip" : ip, "internet_ip" : ip2});
            } else {
                map.push({"intranet_ip" : ip2, "internet_ip" : ip});
            }
        }
    }  
    return map;
}
console.log(getLocalIP());

修改後的(是不是簡單的多了,我只求能用就行,我這個可不一定適用於你哦,只不過給大家個思路而已)

var os = require('os');
//獲取內網ip
function getLocalIp(){
    var map = [];  
    var ifaces = os.networkInterfaces();
    for (var dev in ifaces) {  
        if(ifaces[dev][1].address.indexOf('192.168') != -1) {  
            return ifaces[dev][1].address;  
        }  
    }    
    return map;
}
exports.getLocalIp=getLocalIp;


接下來修改Grunt的express模組的hostnam屬性

hostname: getLocalIP()

大功告成!