Node.js 如何让节点重新处理/etc/hosts?

Node.js 如何让节点重新处理/etc/hosts?,node.js,Node.js,因此,对于单元测试,我需要将域重定向到特定机器的新IP。我已经在节点中设置了一个路由来更新机器的主机文件 exports.hosts = function hosts(req, res) { var domain = req.params.domain; var ip = req.params.ip; if (domain === 'localhost') { res.json(500, {message: 'invalid domain'}); return;

因此,对于单元测试,我需要将域重定向到特定机器的新IP。我已经在节点中设置了一个路由来更新机器的主机文件

exports.hosts = function hosts(req, res) {
  var domain = req.params.domain;
  var ip = req.params.ip;

  if (domain === 'localhost') {
    res.json(500, {message: 'invalid domain'});
    return;
  }

  async.waterfall([
    function (callback) {
      fs.readFile('/etc/hosts', callback);
    },
    function (data, callback) {
      // Remove existing entry
      var lines = data.toString().split('\n');
      data = '';
      for (var line in lines) {
        if (!_str.endsWith(lines[line], domain) && lines[line]) {
          data += lines[line] + '\n';
        }
      }
      callback(null, data);
    },
    function (data, callback) {
      if (ip) {
        data += ip + ' ' + domain + '\n';
      }
      callback(null, data);
    },
    function (data, callback) {
      fs.writeFile('/etc/hosts', data, callback);
    }
  ],
  function (err) {
    if (err) {
      res.json(500, err);
    } else {
      res.send(200);
    }
  });
};
编辑工作很好。问题是,我从节点进程对域的下一次调用仍然转到最后一个IP地址。如果我重新启动节点,它会在主机文件中看到新的IP地址

exports.hosts = function hosts(req, res) {
  var domain = req.params.domain;
  var ip = req.params.ip;

  if (domain === 'localhost') {
    res.json(500, {message: 'invalid domain'});
    return;
  }

  async.waterfall([
    function (callback) {
      fs.readFile('/etc/hosts', callback);
    },
    function (data, callback) {
      // Remove existing entry
      var lines = data.toString().split('\n');
      data = '';
      for (var line in lines) {
        if (!_str.endsWith(lines[line], domain) && lines[line]) {
          data += lines[line] + '\n';
        }
      }
      callback(null, data);
    },
    function (data, callback) {
      if (ip) {
        data += ip + ' ' + domain + '\n';
      }
      callback(null, data);
    },
    function (data, callback) {
      fs.writeFile('/etc/hosts', data, callback);
    }
  ],
  function (err) {
    if (err) {
      res.json(500, err);
    } else {
      res.send(200);
    }
  });
};

如何让节点在不重新启动进程的情况下查看更新的主机文件?

我知道这已经晚了,但我认为与环境变量类似,主机文件信息可能会被加载和缓存。出于同样的原因,您必须重新启动软件才能注意到这些新的env变量,您可能需要终止节点进程并重新启动它以获取新的hosts条目。如果您安装了类似的东西,您将稍微调整初始启动命令:
pm2 start app.js
而不是
node app.js
。然后,每次你更新你的主机文件,杀死你的应用程序和pm2将重新启动它。杀死你的应用程序就像
process.kill()
process.exit()
,或者抛出错误一样简单