在使用 Node.js 开发 网络应用的时候,大多使用框架,如 express、koa等,很少直接使用 http 模块来构建一个服务器。这里我们就具体实践一下。
1、搭建一个简单的http服务器
// server.js
const http = require('http')
const server = http.createServer(function(req,res){
res.writeHead(200, { 'Content-Type' : 'text/plain'})
res.write('Hello world')
res.end()
})
server.listen(8000, function(){
console.log("Listening on port 8000")
})
创建一个客户端
// client.js
const http = require('http')
let options = {
port:8000
}
// 创建http请求
const req = http.request(options, function(res){
console.log('HTTP headers:', res.headers)
// 监听请求的返回数据
res.on('data', function(chunk){
console.log('Body :', chunk.toString())
})
res.on('end', () => {
console.log('响应中已无数据。');
});
})
// 结束并发送请求
req.end();
执行上面 server.js 创建了一个 http 服务器,执行 client.js 创建了一个 http 客户端请求。
2、创建一个http代理服务器
在服务端程序开法时,代理服务器能做很多事情,如:缓存文件、压缩文件、广告拦截、IP过滤等等。在生产环境,通常都是使用 nginx 来做代理服务器。但是为了理解 http 模块的使用,这里用 http 模块来创建一个代理服务器。
根据实例1,可以看出 http.createServer 和 http.request 可以创建服务和发送请求,所以,代理就可以使用这两个方法来实现。
const http = require('http')
const url = require('url')
// 创建代理服务
const server = http.createServer(function(req,res){
console.log('开始请求:', req.url);
// TODO 可以通过构造 options来请求真正需要的地址
let options = url.parse(req.url);
options.headers = req.headers;
// 创建真实请求
const proxyReq = http.request(options, function(proxyRes){
// 监听数据,返回给浏览器
proxyRes.on('data', function(chunk){
console.log('返回到代理的数据 :', chunk.toString())
//给原始请求,准备响应数据
res.write(chunk, 'binary');
})
// 监听代理请求完成
proxyRes.on('end', function(){
console.log('代理结束')
// 响应完成
res.end();
});
// 发送头部信息给浏览器
res.writeHead(proxyRes.statusCode, proxyRes.headers);
});
// 获取从浏览器发送到代理服务器的数据
req.on('data',function(chunk){
console.log('请求数据大小:', chunk.length)
// 发送代理请求
proxyReq.write(chunk, 'binary');
})
// 监听原始请求结束
req.on('end',function(){
console.log('原始请求结束')
// 发送代理请求
proxyReq.end();
})
})
// 启动代理服务器
server.listen(8000, function(){
console.log("代理服务启动端口: 8000 ")
})