345

Node.js を使用して、次の Web ページの html コンテンツを取得しようとする場合:

eternagame.wikia.com/wiki/EteRNA_Dictionary

次のエラーが表示されます。

events.js:72
    throw er; // Unhandled 'error' event
          ^
Error: getaddrinfo ENOTFOUND
    at errnoException (dns.js:37:11)
    at Object.onanswer [as oncomplete] (dns.js:124:16)

私はすでにstackoverflowでこのエラーを調べましたが、これはnode.jsがDNSからサーバーを見つけることができないためであることに気付きました(私は思う)。ただし、私のコードは完全に動作するため、これがなぜなのかはわかりませんwww.google.com

これが私のコードです(ホストが変更されたことを除いて、非常によく似た質問から実際にコピーして貼り付けました):

var http = require("http");

var options = {
    host: 'eternagame.wikia.com/wiki/EteRNA_Dictionary'
};

http.get(options, function (http_res) {
    // initialize the container for our data
    var data = "";

    // this event fires many times, each time collecting another piece of the response
    http_res.on("data", function (chunk) {
        // append this chunk to our growing `data` var
        data += chunk;
    });

    // this event fires *one* time, after all the `data` events/chunks have been gathered
    http_res.on("end", function () {
        // you can use res.send instead of console.log to output via express
        console.log(data);
    });
});

コピーして貼り付けたソースは次のとおりです。ExpressjsでWebサービスを呼び出す方法は?

node.js でモジュールを使用していません。

読んでくれてありがとう。

4

18 に答える 18

351

Node.jsモジュール HTTPのドキュメント: http://nodejs.org/api/http.html#http_http_request_options_callback

を呼び出すこともできますhttp.get('http://eternagame.wikia.com/wiki/EteRNA_Dictionary', callback)。URL はurl.parse();で解析されます。または を呼び出しますhttp.get(options, callback)options

{
  host: 'eternagame.wikia.com',
  port: 8080,
  path: '/wiki/EteRNA_Dictionary'
}

アップデート

@EnchanterIO のコメントに記載されているように、portフィールドも別のオプションです。プロトコルはフィールドhttp://に含めるべきではありません。SSLが必要な場合host、他の回答でもモジュールの使用が推奨されています。https

于 2013-07-17T05:08:14.950 に答える
270

エラーの別の一般的な原因

Error: getaddrinfo ENOTFOUND
    at errnoException (dns.js:37:11)
    at Object.onanswer [as oncomplete] (dns.js:124:16)

プロパティを設定するときにプロトコル(https、https、...)を書いていますhostoptions

  // DON'T WRITE THE `http://`
  var options = { 
    host: 'http://yoururl.com',
    path: '/path/to/resource'
  }; 
于 2015-02-07T17:26:42.063 に答える
21

HTTPリクエストのオプションで、に切り替えます

var options = { host: 'eternagame.wikia.com', 
                path: '/wiki/EteRNA_Dictionary' };

これで問題は解決すると思います。

于 2013-07-17T05:07:52.783 に答える
12

If you need to use https, then use the https library

https = require('https');

// options
var options = {
    host: 'eternagame.wikia.com',
    path: '/wiki/EteRNA_Dictionary'
}

// get
https.get(options, callback);
于 2016-08-10T23:39:12.507 に答える
11
  var http=require('http');
   http.get('http://eternagame.wikia.com/wiki/EteRNA_Dictionary', function(res){
        var str = '';
        console.log('Response is '+res.statusCode);

        res.on('data', function (chunk) {
               str += chunk;
         });

        res.on('end', function () {
             console.log(str);
        });

  });
于 2013-07-17T06:23:06.140 に答える
4

この問題は、参照しているドメインがダウンした場合にも発生する可能性があることに注意してください (たとえば、存在しなくなりました)。

于 2015-08-11T18:11:21.137 に答える
4

私はこれでこのエラーを修正しました

$ npm info express --verbose
# Error message: npm info retry will retry, error on last attempt: Error: getaddrinfo ENOTFOUND registry.npmjs.org registry.npmjs.org:443
$ nslookup registry.npmjs.org
Server:     8.8.8.8
Address:    8.8.8.8#53

Non-authoritative answer:
registry.npmjs.org  canonical name = a.sni.fastly.net.
a.sni.fastly.net    canonical name = prod.a.sni.global.fastlylb.net.
Name:   prod.a.sni.global.fastlylb.net
Address: 151.101.32.162
$ sudo vim /etc/hosts 
# Add "151.101.32.162 registry.npmjs.org` to hosts file
$ npm info express --verbose
# Works now!

元のソース: https://github.com/npm/npm/issues/6686

于 2018-01-05T09:49:34.117 に答える
1

開発環境から本番環境に移行するときにこのエラーが発生しました。https://私はすべてのリンクを貼ることに夢中になりました。これは必須ではないので、一部の人にとっては解決策になるかもしれません。

于 2015-06-12T10:21:46.360 に答える
1

request モジュールを使用して試してみたところ、そのページの本文を簡単に印刷できました。残念ながら、私の持っているスキルでは、それ以外に手伝えることはありません。

于 2013-07-17T05:07:50.280 に答える
1

同じエラーが発生し、以下のリンクを使用してヘルプを取得しました。

https://nodejs.org/api/http.html#http_http_request_options_callback

私は自分のコードに持っていませんでした:

req.end();

(NodeJs V: 5.4.0)行の 上に追加req.end();すると、エラーを取り除くことができ、問題なく動作しました。

于 2016-01-10T05:45:58.473 に答える
0

http と余分なスラッシュ (/) を取り除きました。この「node-test.herokuapp.com」を使用したところ、うまくいきました。

于 2016-07-22T10:29:09.380 に答える