Node中http模块

http 模块

什么是 http 模块

  1. http 模块是 Node.js 官方提供的、用来创建 web 服务器的模块。通过 http 模块提供的 http.createServer() 方法,就能方便的把一台普通的电脑,变成一台 Web 服务器,从而对外提供 Web 资源服务

  2. 如果要希望使用 http 模块创建 Web 服务器,则需要先导入它

    const http = require('http')
    

http 模块的作用

  1. 服务器和普通电脑的区别在于,服务器上安装了 web 服务器软件

    • 例如:IISApache 等。通过安装这些服务器软件,就能把一台普通的电脑变成一台 web 服务器
  2. 在 Node.js 中,我们不需要使用 IISApache 等这些第三方 web 服务器软件。因为我们可以基于 Node.js 提供的 http 模块,通过几行简单的代码,就能轻松的手写一个服务器软件,从而对外提供 web 服务

服务器相关的概念

ip 地址
  1. IP 地`就是互联网上每台计算机的唯一地址,因此 IP 地址 具有唯一性
  2. IP 地址 的格式:通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d 都是 0~255 之间的十进制整数
  • 例如:用点分十进表示的 IP地址(192.168.1.1)

注意事项

  1. 互联网中每台 Web 服务器,都有自己的 IP 地址
    • 例如:大家可以在 Windows 的终端中运行 ping www.baidu.com 命令,即可查看到百度服务器的 IP 地址
  2. 在开发期间,自己的电脑既是一台服务器,也是一个客户端,为了方便测试,可以在自己的浏览器中输入 127.0.0.1
  3. 这个 IP 地址,就能把自己的电脑当做一台服务器进行访问了
域名和域名服务器
  1. 尽管 IP 地址 能够唯一地标记网络上的计算机,但 IP地址 是一长串数字,不直观,而且不便于记忆,于是人们又发明了另一套字符型的地址方案,即所谓的域名地址(Domain Name)

  2. IP地址域名 是一一对应的关系,这份对应关系存放在一种叫做域名服务器 (DNS,Domain name server) 的电脑中。使用者只需通过好记的域名访问对应的服务器即可,对应的转换工作由域名服务器实现。因此,域名服务器就是提供 IP 地址 和域名之间的转换服务的服务器

注意事项:

  1. 单纯使用 IP 地址,互联网中的电脑也能够正常工作。但是有了域名的加持,能让互联网的世界变得更加方便
  2. 在开发测试期间, 127.0.0.1 对应的域名是 localhost,它们都代表我们自己的这台电脑,在使用效果上没有任何区别

创建web服务器

实现步骤和核心代码
  1. 导入 http 模块

    const http = require('http')
    
  2. 创建 web 服务器实例

    // 调用 http.createServer() 方法,即可快速创建一个 web 服务器实例
    
    const server = http.createServer()
    
  3. 为服务器实例绑定 request 事件

    // 为服务器实例绑定 request 事件,即可监听客户端发送过来的网络请求
    
    // 使用服务器实例的 .on() 方法,为服务器绑定一个 request 事件
    server.on('request', (req, res) => {
      // 只要有客户端来请求我们自己的服务器,就会被触发 request 事件,从而调用这个事件处理程序
      console.log('访问服务器成功')
    })
    
  4. 启动服务器

    // 调用服务器实例的 .listen() 方法,即可启动当前的 web 服务器实例
    
    server.listen(80, () => {
        console.log('running……')
    })
    
创建基本的服务器
// 1. 导入 http 模块
const http = require('http')

// 2. 创建 web 服务器实例
const server = http.createServer()

// 3. 为服务器实例绑定 request 事件,监听客户端的请求
server.on('request', function (req, res) {
  console.log('访问服务器成功')
})

// 4. 启动服务器
server.listen(8080, function () {  
  console.log('running……')
})

req 请求对象

服务器接收到客户端的请求,就会调用通过 server.on() 为服务器绑定的 request 事件处理程序,如果想在事件处理程序中,访问与客户端相关的数据和属性,可以使用如下方式:

server.on('request', function (req, res) {
  // req 是请求对象,它包含了与客户端相关的数据和属性
  // req.url 获取客户端请求的 url 地址
  // req.method 获取客户端请求的类型

  const str = `${req.url} -- ${req.method}`

  console.log(str)
})
res 响应对象

在服务器的 request 事件处理程序中,如果想访问与服务器相关的数据和属性,可以使用如下方式

server.on('request', function (req, res) {
  // res 是响应对象,它包含了与服务器相关的数据和属性
  // 例如:将字符串发送到客户端

  const str = `${req.url} -- ${req.method}`
  
  // res.end() 方法的作用
  // 向客户端发送指定的内容,并结束这次请求的处理过程
  res.end(str)
})
解决中文乱码问题

当调用 res.end() 方法,向客户端发送中文内容的时候,会出现乱码问题,此时,需要手动设置内容的编码格式

server.on('request', function (req, res) {
  // 发送包含中文的内容
  const str = `您请求的 url 地址是:${req.url},请求的 method 类型是:${req.method}`

  // 为了防止中文乱码问题,需要设置响应头,
  res.setHeader('Content-Type', 'text/html; charset=utf-8')

  // 把包含中文的内容返回给客户端
  res.end(str)
})

根据不同的 url 响应不同的内容

核心实现步骤
  1. 获取请求的 url 地址
  2. 设置默认的响应内容为 404 Not found
  3. 判断用户请求的是否为 //index.html 首页
  4. 判断用户请求的是否为 /about.html 关于页面
  5. 设置 Content-Type 响应头,防止中文乱码
  6. 使用 res.end() 把内容响应给客户端
动态响应内容
server.on('request', function (req, res) {
  // 1、获取请求的 url 地址
  const url = req.url
  // 2、设置默认的内容为 404 Not Found
  let content = '<h4>404 Not Found</h4>'
  // 3、用户请求的是首页
  if (url === '/' || url === '/index.html') {
    content = '<h4>首页</h4>'
  } else if (url === '/about.html') {
    // 4、用户请求的是关于我们页面
    content = '<h4>关于我们</h4>'
  }

  // 5、设置 Content-Type 响应头,防止中文乱码
  res.setHeader('Content-Type', 'text/html; charset=utf-8')

  // 6、将内容发送给客户端
  res.end(content)
})

时钟 web 服务器案例

核心思路

把文件的实际存放路径,作为每个资源的请求 url 地址
在这里插入图片描述

实现思路
  1. 导入需要的模块
  2. 创建基本的 web 服务器
  3. 将资源的请求 url 地址 映射为文件的存放路径
  4. 读取文件内容并响应给客户端
  5. 优化资源的请求路径
实现步骤
  1. 导入需要的模块

    // 1.1 导入 http 模块
    const http = require('http')
    // 1.2 导入 fs 文件系统模块
    const fs = require('fs')
    // 1.3 导入 path 路径处理模块
    const path = require('path')
    
    
  2. 创建基本的 web 服务器

    // 2.1 创建 web 服务器
    const server = http.createServer()
    
    // 2.2 监听 web 服务器的 request 事件
    server.on('request', (req, res) => {})
    
    // 2.3 启动 web 服务器
    server.listen(80, () => {
      console.log('running……')
    })
    
    
  3. 将资源的请求 url 地址映射为文件的存放路径

    server.on('request', (req, res) => {
      // 3.1 获取到客户端请求的 url 地址
      const url = req.url
      // 3.2 把请求的 url 地址,映射为本地文件的存放路径
      const fpath = path.join(__dirname, url)
    })
    
    
  4. 根据映射过来的文件路径读取文件

    // 4.1 根据映射过来的文件路径读取文件
    fs.readFile(fpath, 'utf8', (err, dataStr) => {
      // 4.2 读取文件失败后,向客户端响应固定的 "错误消息"
      if (err) return res.end('404 Not Fount')
    
      // 4.3 读取文件成功后,将 "读取成功的内容" 响应给客户端
      res.end(dataStr)
    })
    
  5. 优化资源的请求路径

    // // 3.2 把请求的 url 地址,映射为本地文件的存放路径
    // const fpath = path.join(__dirname, url)
    
    // 5.1 预定义空白的文件存放路径
    let fpath = ''
    if (url === '/') {
      // 5.2 如果请求的路径是 / ,则手动指定文件的存放路径
      fpath = path.join(__dirname, './clock/index.html')
    } else {
      // 5.3 如果请求的路径不为 / ,则动态拼接文件的存放路径
      fpath = path.join(__dirname, './clock', url)
    }
    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值