node 请求使用动态 hosts

开发中使用 hosts 司空见惯,但如果一个需求,用户表单输入 hosts 后台使用这个 hosts 去请求,如何用正确的姿势去请求呢?

如果每次都修改 hosts 文件,那,,也许,,不太科学,如果是个临时 hosts 呢?hosts 文件会越来越臃肿,不推荐。

在百度,谷歌无果后 (也许关键词不对,反正没找到),自己尝试了下,却发现异常简单。

hosts demo

假设我们要添加如下临时 hosts:

1
192.168.1.10 dev.domain.com

node 代码如下:

1
2
3
4
5
6
7
8
9
10
const http = require('http');

const options = {
host: '192.168.1.10',
path: 'http://dev.domain.com/info.html',
};

http.get(options, (res) => {
res.pipe(process.stdout);
});

保存为 test.js 后执行:

1
$ node test.js

即可在控制台看到执行结果。

这里为了偷懒,直接将结果 pipe 到控制台了。

使用 got 模块

当然,为了 hosts 而重新手写封装请求,简直不能忍,所以推荐 got 模块,这是一个非常优雅的 node request 模块。

1
2
3
4
5
6
7
8
9
10
11
const got = require('got');

const options = {
host: '192.168.1.10',
path: 'http://dev.domain.com/info.html',
};

(async () => {
const { body } = await got(options);
console.log(body);
})();

结合 async/await 简直爽的不要不要的。

小结

原理嘛,其实就是服务器是根据请求头(headers)里的 host 是字段来匹配具体访问哪一个web服务。
所以只要指定请求的服务器 IP + headers.host 即可访问指定 IP 下指定的 web 服务。

1
2
3
4
5
6
7
8
9
10
11
12
13
const http = require('http');

const options = {
host: '192.168.1.10',
path: '/info.html',
headers: {
host: 'dev.domain.com'
}
};

http.get(options, (res) => {
res.pipe(process.stdout);
});

如果是这个例子,也许就好理解了。

真心不理解也无所谓,反正简单,能用,就好了。