13

私は Node.js を初めて使用し、node.dns.resolveNs 関数の使用に問題があります。

一部のドメインは完全にダウンしており、応答を取得するのに約 1 分かかります。これは通常、「queryNs ETIMEOUT」です。10 秒などの短い期間に設定する方法はありますか?

4

5 に答える 5

20

関数呼び出しでタイムアウトを直接設定する方法はわかりませんが、呼び出しの周りに小さなラッパーを作成して、タイムアウトを自分で処理できます。

var dns = require('dns');

var nsLookup = function(domain, timeout, callback) {
  var callbackCalled = false;
  var doCallback = function(err, domains) {
    if (callbackCalled) return;
    callbackCalled = true;
    callback(err, domains);
  };

  setTimeout(function() {
    doCallback(new Error("Timeout exceeded"), null);
  }, timeout);

  dns.resolveNs(domain, doCallback);
};

nsLookup('stackoverflow.com', 1000, function(err, addresses) {
  console.log("Results for stackoverflow.com, timeout 1000:");
  if (err) {
    console.log("Err: " + err);
    return;
  }
  console.log(addresses);
});

nsLookup('stackoverflow.com', 1, function(err, addresses) {
  console.log("Results for stackoverflow.com, timeout 1:");
  if (err) {
    console.log("Err: " + err);
    return;
  }
  console.log(addresses);
});

上記のスクリプトの出力:

Results for stackoverflow.com, timeout 1:
Err: Error: Timeout exceeded
Results for stackoverflow.com, timeout 1000:
[ 'ns1.serverfault.com',
  'ns2.serverfault.com',
  'ns3.serverfault.com' ]
于 2012-05-27T22:45:07.633 に答える
15

Node.jsdns.resolve*は、タイムアウトやその他のさまざまなオプションをネイティブにサポートする c-ares ライブラリをその下で使用します。残念ながら、Node.js はこれらの調整可能変数を公開していませんが、それらの一部はRES_OPTIONS環境変数を介して設定できます。

例:RES_OPTIONS='ndots:3 retrans:1000 retry:3 rotate' node server.js

  • ndots: ARES_OPT_NDOTS と同じ
  • retrans: ARES_OPT_TIMEOUTMS と同じ
  • retry: ARES_OPT_TRIES と同じ
  • rotate: ARES_OPT_ROTATE と同じ

各オプションの意味の詳細については、man ares_init_options(3) を参照してください。

于 2017-07-30T19:00:38.190 に答える
1

また、ルックアップがアプリケーションをブロックする可能性があることも知っておくとよいでしょう。

dns.lookupノードのメソッドを置換/拡張するモジュールを開発しました。主な目標は、スレッド プールのブロックに関する問題を回避することです。したがって、モジュールは応答をキャッシュし、複数レコードの解決と TTL サポートを備えています。また、100% のカバレッジを備えた優れた単体テストと機能テストもあります。モジュールは、実稼働環境と高負荷環境でテストされました。MIT ライセンスの下で。

ここにあります:https://github.com/LCMApps/dns-lookup-cache

私はそれが役立つと信じています!

于 2019-03-25T17:19:55.427 に答える
0

@redbaron の回答に基づいて構築すると、実行時に RES_OPTIONS 変数を設定して、によって使用される c-ares ライブラリのタイムアウトを設定できますdns.resolve*

// this will timeout for (1000 * 3 * 2) ms
process.env.RES_OPTIONS='ndots:3 retrans:1000 retry:3 rotate';
于 2021-03-12T14:43:34.117 に答える