Node实践 --- http 模块

456 阅读2分钟

在使用 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 ")
})