2012-03-06 31 views
33

更新 - 通過自我回復 我看到一個人必須確保從計算機上正確解析DNS,檢查此代碼以確保url可到達nodejs.org/文檔/最新/ API/dns.html#dns.resolvenodejs httprequest與數據 - 獲取錯誤getaddrinfo ENOENT

原始的問題

我寫的基於程序的節點,其中,用戶可以要求我做一個HTTPRequest,代表他們{偏離航向他們爲我提供了一些數據,並與方法調用}但每次我做一個HTTPRequest,一次給我一個錯誤

的getaddrinfo ENOENT 這是我的代碼看起來

function makehttprequest(deviceid, httpaction, httppath,methods, actiondata, callback) { 
console.log('we are here with httpaction' + httpaction + ' path ' + httppath + ' method ' + methods + ' action data ' + actiondata); 
//do the http post work, get the data, and call the callback function with return data 
var options = { 
    host: httpaction, 
    port: 80, 
    path: httppath, 
    method: methods 
}; 

    try { 
     var req = http.request(options, function(res) { 
     console.log('STATUS: ' + res.statusCode); 
     console.log('HEADERS: ' + JSON.stringify(res.headers)); 
     res.setEncoding('utf8'); 
     res.on('data', function (chunk) { 
      console.log('BODY: ' + chunk); 
     }); 
     }); 
    } catch(e) { 
     console.log('error as : ' + e.message); 
    } 

    req.on('error', function(e) { 
     console.log('problem with request: ' + e.message); 
    }); 

    // write data to request body 
    console.log('writing data to request ..'); 
    req.write(actiondata); 
    console.log('finished writing data to request…'); 
    req.end(); 
    console.log('request ended…'); 
} 
+1

對於本地開發,請使用127.0.0.1而不是本地主機 – 2016-06-23 06:00:04

回答

74

我已經看到這種情況發生時,你的主機(你在通過爲httpaction)具有方案(這樣的「http://」)在前面的。您的主機應該嚴格像「www.google.com」而不是「http://www.google.com」或「www.google.com/hello-world」或「http://www.google.com/hello-world」的域。

保持它只是域。

下面是一個例子:http://allampersandall.blogspot.com/2012/03/nodejs-http-request-example.html

+1

對於「www.google.com」,而不是「http://www.google.com」。這解決了我的問題。 – Eye 2012-06-28 05:05:24

+0

你是一個了不起的人!不會想到這一點。 – Slavo 2012-10-25 20:12:37

+0

如果u需要https://開頭?如果您跳過它,默認將變爲http:// – 2013-01-03 03:43:26

3

我得到[錯誤:的getaddrinfo ENOENT],但它是越來越之後[錯誤:連接EMFILE]。因爲我正在用數千個客戶端進行負載測試,所以EMFILE錯誤(根本原因)是不透明的。解決方案是the same as for EMFILE:增加文件描述符的數量。只要在這裏添加它,以防其他人有相同的問題。

2

調用server.listen(PORT, HOST);其中HOST無法解析回本地機器,當我得到這個錯誤。

有一次,我改變了這一回主機名/域名/ IP本地機器決心,這個錯誤就走開了。

因爲我是想通過用於開發目的,我增加了一個入口到我的主機與所需的主機文件,並確保這種匹配傳遞給server.listen()

8

問題的主機名,如果您有也有可能發生一個主機連接一個斜線:

好:"www.google.com"

壞:"www.google.com/"

3

我今天再次打這個了愚蠢的錯誤。這是因爲端口號被作爲主機名的一部分。

// wrong. gets error getaddrinfo ENOENT 
var options = { 
    hostName: 'localhost:1337', 
    .... 
} 

// correct 
var options = { 
    hostname: 'localhost', 
    port: 1337, 
}; 
+0

如果你從請求標頭(通用代理)拉取主機名,只需要request.headers ['host']。split(':')[0]去掉端口 – netpoetica 2014-07-10 02:06:16

0

這些主機名/協議/端口/斜線問題,如果你所有的代碼似乎是好的,但是仍得到同樣的錯誤,這是我的情況下,將溶液檢查我的/etc/resolv.conf文件的域名服務器。

我在resolv.conf文件(8.8.8.8)的開頭添加了Google的名稱服務器,代碼再次正常工作,沒有更多的錯誤。

這是值得注意的是,開始發生在我身上的2015年2月4日這個錯誤我跑了sudo apt-get upgrade後,我的節點JS必須已更新,並引入了錯誤,這似乎是與域名服務器,我有不兼容的。

起初我檢查我是否有通過獲取我需要使用命令行上wget的URL的任何DNS問題,我得到了目標URL的內容細,所以我不認爲它實際上是一個DNS的問題,但它是。

0

我有一個類似的問題,但作爲AWS Lambda函數運行,所以如果有人遇到了Lambda函數的這個問題,這是我如何解決它。

  • 給你的拉姆達功能的VPC。
  • 至少選擇2個子網。
  • 並選擇一個安全組。

我花了一天,直到我找到了這個修復程序,希望它可以幫助別人。