6

正如文档所说:

dns 模块中的所有方法都使用 C-Ares,但 dns.lookup 除外,它在线程池中使用 getaddrinfo(3)。

但是,netandhttp模块总是使用dns.lookup. 有没有办法改变这个?getaddrinfo是同步的,池将只允许 4 个并发请求。

4

1 回答 1

4

经过调查,似乎唯一的方法是手动执行 DNS 请求。我使用这样的东西:

var dns = require('dns'),
    http = require('http');

function httpRequest(options, body, done) {
  var hostname = options.hostname || options.host;

  if (typeof(body) === 'function') {
    done = body;
    body = null;
  }

  // async resolve with C-ares
  dns.resolve(hostname, function (err, addresses) {
    if (err)
      return done(err);

    // Pass the host in the headers so the remote webserver
    // can use the correct vhost.
    var headers = options.headers || {};
    headers.host = hostname;
    options.headers = headers;

    // pass the resolved address so http doesn't feel the need to
    // call dns.lookup in a thread pool
    options.hostname = addresses[0];
    options.host = undefined;

    var req = http.request(options, done);

    req.on('error', done);

    if (body)
      req.write(body);

    req.end();
  });
}
于 2013-12-12T11:08:10.963 回答