web-dev-qa-db-ja.com

nodejs httprequest with data-エラーgetaddrinfo ENOENTの取得

更新-自己回答

DNSがマシンから適切に解決されていることを確認する必要があると思います。 ノードのドキュメント をチェックして、ドメインが解決可能であることを確認してください。

元の質問

私はノードベースのプログラムを書いていますが、ユーザーは私に代わって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…');
}
36

これは、ホスト(httpactionとして渡す)の前にスキーム(「http://」)がある場合に発生します。ホストは、「 http://www.google.com 」や「www.google.com/hello-world」や「-」ではなく、「www.google.com」のようなドメインでなければなりません http://www.google.com/hello-world "。

ドメインだけにしてください。

次に例を示します。 http://allampersandall.blogspot.com/2012/03/nodejs-http-request-example.html

76
Micah

この問題は、末尾にスラッシュがある場合にも発生する可能性があります。

良い:"www.google.com"

悪い:"www.google.com/"

8
rockerston

requestの代わりにhttpモジュールを使用して、これらのホスト名/プロトコル/ポート/スラッシュの問題をすべて回避します

https://github.com/mikeal/request

4
jpillora

[エラー:Getaddrinfo ENOENT]が表示されていましたが、[エラー:EMFILEに接続]が表示された直後です。私は何千ものクライアントで負荷テストを行っているため、EMFILEエラー(根本原因)が隠されていました。解決策は EMFILEの場合と同じ :ファイル記述子の数を増やします。他の誰かが同じ問題を抱えている場合に備えて、ここに完全に追加してください。

3
alexfernandez

私はばかげた間違いのために今日これを再度打った。これは、ポート番号がホスト名の一部として配置されたためです。

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

// correct
var options = {
    hostname: 'localhost',
    port: 1337,
};
3
Sushil

ホストをローカルマシンに解決できなかったserver.listen(PORT, Host);を呼び出すと、このエラーが発生しました。

これをローカルマシンが解決するホスト名/ドメイン名/ IPに戻すと、このエラーはなくなりました。

開発目的でホスト名を介して接続しようとしたため、目的のホスト名を使用してホストファイルにエントリを追加し、server.listen()に渡されるホスト名と一致するようにしました。

2
russholio

すべてのコードが正常であるように見え、それでも同じエラーが表示される場合(私の場合)、解決策は/etc/resolv.confファイルのネームサーバーをチェックしていました。

resolv.confファイル(8.8.8.8)の先頭にGoogleのネームサーバーを追加しましたが、コードは再び正常に動作し始め、エラーはなくなりました。

Sudo apt-get upgradeを実行した後、2015年2月4日にこのエラーが発生し始めたことに注目する価値があります。ノードjsが更新され、バグが導入されました。

最初に、コマンドラインでwgetを使用して必要なURLを取得することにより、DNSの問題があるかどうかを確認しました。ターゲットURLのコンテンツを取得したので、実際にはDNSの問題だとは思わなかった、しかしそうだった。

0
Gubatron

同様の問題がありましたが、AWS Lambda関数として実行されていたため、誰かがLambda関数でこの問題を抱えている場合、これが解決した方法です。

  • Lambda関数にVPCを提供します。
  • 少なくとも2つのサブネットを選択します。
  • そして、セキュリティグループを選択します。

この修正が見つかるまで1日を費やしました。

0
Ninos