http 模块

news2024/11/15 10:08:07

1、什么是 http 模块

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

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

const http = require('http')

2、创建最基本的 web 服务器

2.1、创建 web 服务器的基本步骤

  1. 导入 http 模块
  2. 创建 web 服务器实例
  3. 为服务器实例绑定 request 事件,监听客户端的请求
  4. 启动服务器

2.2、创建过程

(1)导入 http 模块

如果希望在自己的电脑上创建一个 web 服务器,从而对外提供 web 服务,则需要导入 http 模块:

const http = require('http')

(2)创建 web 服务器实例

调用 http.createServer() 方法,即可快速创建一个 web 服务器实例:

const server = http.createServer()

(3)为服务器实例绑定 request 事件

为服务器实例绑定 request 事件,即可监听客户端发送过来的网络请求:

// 使用服务器实例的 .on() 方法,为服务器绑定一个 request 事件
server.on('request', function (req, res) {
  // 只要有客户端来请求我们自己的服务器,就会触发 request 事件,从而调用这个事件处理函数
  console.log('Someone visit our web server.')
})

(4)启动服务器

调用服务器实例的 .listen() 方法,即可启动当前的 web 服务器实例:

// 调用 server.listen(端口号, callback回调方法),即可启动 web 服务器
server.listen(8080, function () {  
  console.log('server running at http://127.0.0.1:8080')
})

(5)完整代码

// 1. 导入 http 模块
const http = require('http')
// 2. 创建 web 服务器实例
const server = http.createServer()
// 3. 为服务器实例绑定 request 事件,监听客户端的请求
server.on('request', function (req, res) {
  console.log('Someone visit our web server.')
})
// 4. 启动服务器
server.listen(8080, function () {  
  console.log('server running at http://127.0.0.1:8080')
})

2.3、req 请求对象

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

server.on('request', (req, res) => {
   // req 是请求对象,它包含了与客户端相关的数据和属性,例如:
  // req.url 是客户端请求的 URL 地址
  const url = req.url
  // req.method 是客户端请求的 method 类型
  const method = req.method
  const str = `Your request url is ${url}, and request method is ${method}`
  console.log(str)
})

2.4、res 响应对象

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

server.on('request', (req, res) => {
  // res 是响应对象,它包含了与服务器相关的数据和属性,例如:
  // 要发送到客户端的字符串
  const str = `Your request url is ${req.url}, and request method is ${req.method}`
  console.log(str)
  // res.end() 方法的作用:
  // 向客户端发送指定的内容,并结束这次请求的处理过程
  res.end(str)
})

2.5、完整示例:

const http = require('http')
const server = http.createServer()
// req 是请求对象,包含了与客户端相关的数据和属性
server.on('request', (req, res) => {
  // req.url 是客户端请求的 URL 地址
  const url = req.url
  // req.method 是客户端请求的 method 类型
  const method = req.method
  const str = `Your request url is ${url}, and request method is ${method}`
  console.log(str)
  // 调用 res.end() 方法,向客户端响应一些内容
  res.end(str)
})
server.listen(80, () => {
  console.log('server running at http://127.0.0.1')
})

2.6、解决中文乱码问题

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

const http = require('http')
const server = http.createServer()

server.on('request', (req, res) => {
  // 定义一个字符串,包含中文的内容
  const str = `您请求的 URL 地址是 ${req.url},请求的 method 类型为 ${req.method}`
  // 调用 res.setHeader() 方法,设置 Content-Type 响应头,解决中文乱码的问题
  res.setHeader('Content-Type', 'text/html; charset=utf-8')
  // res.end() 将内容响应给客户端
  res.end(str)
})

server.listen(80, () => {
  console.log('server running at http://127.0.0.1')
})

3、根据不同的 url 响应不同的 html 内容

核心实现步骤

  1. 获取请求的 url 地址
  2. 设置默认的响应内容为 404 Not found
  3. 判断用户请求的是否为 / 或 /index.html 首页
  4. 判断用户请求的是否为 /about.html 关于页面
  5. 设置 Content-Type 响应头,防止中文乱码
  6. 使用 res.end() 把内容响应给客户端
const http = require('http')
const server = http.createServer()

server.on('request', (req, res) => {
  // 1. 获取请求的 url 地址
  const url = req.url
  // 2. 设置默认的响应内容为 404 Not found
  let content = '<h1>404 Not found!</h1>'
  // 3. 判断用户请求的是否为 / 或 /index.html 首页
  // 4. 判断用户请求的是否为 /about.html 关于页面
  if (url === '/' || url === '/index.html') {
    content = '<h1>首页</h1>'
  } else if (url === '/about.html') {
    content = '<h1>关于页面</h1>'
  }
  // 5. 设置 Content-Type 响应头,防止中文乱码
  res.setHeader('Content-Type', 'text/html; charset=utf-8')
  // 6. 使用 res.end() 把内容响应给客户端
  res.end(content)
})

server.listen(80, () => {
  console.log('server running at http://127.0.0.1')
})

4、案例 - 实现 clock 时钟的 web 服务器

4.1、核心思路

把文件的实际存放路径作为每个资源的请求 url 地址

4.2、资源 

index.css


    html,
    body {
      margin: 0;
      padding: 0;
      height: 100%;
      background-image: linear-gradient(to bottom right, red, gold);
    }

    .box {
      width: 400px;
      height: 250px;
      background-color: rgba(255, 255, 255, 0.6);
      border-radius: 6px;
      position: absolute;
      left: 50%;
      top: 40%;
      transform: translate(-50%, -50%);
      box-shadow: 1px 1px 10px #fff;
      text-shadow: 0px 1px 30px white;

      display: flex;
      justify-content: space-around;
      align-items: center;
      font-size: 70px;
      user-select: none;
      padding: 0 20px;

      /* 盒子投影 */
      -webkit-box-reflect: below 0px -webkit-gradient(linear, left top, left bottom, from(transparent), color-stop(0%, transparent), to(rgba(250, 250, 250, .2)));
    }
  

index.html 

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>index首页</title>
  <link rel="stylesheet" href="./index.css" />
</head>

<body>
  <div class="box">
    <div id="HH">00</div>
    <div>:</div>
    <div id="mm">00</div>
    <div>:</div>
    <div id="ss">00</div>
  </div>

  <script src="./index.js"></script>
</body>

</html>

index.js


    window.onload = function () {
      // 定时器,每隔 1 秒执行 1 次
      setInterval(() => {
        var dt = new Date()
        var HH = dt.getHours()
        var mm = dt.getMinutes()
        var ss = dt.getSeconds()

        // 为页面上的元素赋值
        document.querySelector('#HH').innerHTML = padZero(HH)
        document.querySelector('#mm').innerHTML = padZero(mm)
        document.querySelector('#ss').innerHTML = padZero(ss)
      }, 1000)
    }

    // 补零函数
    function padZero(n) {
      return n > 9 ? n : '0' + n
    }
  

4.3、实现步骤

  • 导入需要的模块
  • 创建基本的 web 服务器
  • 将资源的请求 url 地址映射为文件的存放路径
  • 读取文件内容并响应给客户端
  • 优化资源的请求路径

4.4、示例代码

// 1.1 导入 http 模块
const http = require('http')
// 1.2 导入 fs 模块
const fs = require('fs')
// 1.3 导入 path 模块
const path = require('path')

// 2.1 创建 web 服务器
const server = http.createServer()
// 2.2 监听 web 服务器的 request 事件
server.on('request', (req, res) => {
  // 3.1 获取到客户端请求的 URL 地址
  //     /clock/index.html
  //     /clock/index.css
  //     /clock/index.js
  const url = req.url
  // 3.2 把请求的 URL 地址映射为具体文件的存放路径
  // const fpath = path.join(__dirname, url)
  // 5.1 预定义一个空白的文件存放路径
  let fpath = ''
  if (url === '/') {
    fpath = path.join(__dirname, './clock/index.html')
  } else {
    //     /index.html
    //     /index.css
    //     /index.js
    fpath = path.join(__dirname, '/clock', url)
  }

  // 4.1 根据“映射”过来的文件路径读取文件的内容
  fs.readFile(fpath, 'utf8', (err, dataStr) => {
    // 4.2 读取失败,向客户端响应固定的“错误消息”
    if (err) return res.end('404 Not found.')
    // 4.3 读取成功,将读取成功的内容,响应给客户端
    res.end(dataStr)
  })
})
// 2.3 启动服务器
server.listen(80, () => {
  console.log('server running at http://127.0.0.1')
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/141377.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Centos8/linux下载、安装、配置、连接MySQL5.7(rpm方式)

目录 问题现象&#xff1a; 问题分析&#xff1a; 解决方法&#xff1a; 下载&#xff1a; 安装&#xff1a; 配置&#xff1a; 连接&#xff1a; 拓展 问题现象&#xff1a; 今天在使用Centos8 安装MySQL5.7的rpm包时&#xff0c;出现如下报错&#xff1a; 仓库 "…

【ROS】—— ROS运行管理 ——元功能包与launch文件(八)

文章目录前言1. 元功能包1.1 应用场景1.2 概念1.3 实现2. ROS节点运行管理launch文件2.1 launch文件标签之launch2.2 launch文件标签之node2.3 launch文件标签之include2.4 launch文件标签之remap2.5 launch文件标签之param2.6 launch文件标签之rosparam2.7 launch文件标签之gr…

2023年伊凡最新整理简单方法之为hbuilderx配置node环境实现可npm install

本文优雅草伊凡投稿一颗优雅草科技&#xff0c;欢迎其他朋友们来投稿&#xff08;一定会详细署名&#xff09;&#xff0c;好直接开始&#xff0c;由于伊凡的电脑实在太卡了因此重装了一下系统所有环境全没了可能要一步步做环境了&#xff0c;后续可能会发关于flutter&#xff…

ModStartBlog v6.5.0 后台多页面升级,支持Laravel9

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议。 功能特性 丰富的模块市场&#xff0c;后台一键快速安装会…

DCDC直流非隔离负高电压输出电源模块12V24V转0-负50v/-150v/-200v/-250v/-300v/-400v/-500v

特点● 效率高达70%以上● 1*2英寸标准封装● 单电压负输出● 价格低● 电压控制,输出电压随控制电压变化线性变化● 工作温度: -40℃~85℃● 阻燃封装&#xff0c;满足UL94-V0 要求● 温度特性好● 可直接焊在PCB 上应用GRB 系列模块电源是一种DC-DC升压变换器。该模块电源的输…

linux系统中C++的基本原理与实现

大家好&#xff0c;今天主要和大家分享一下&#xff0c;QT中进行C编程带来的优势和方便的地方&#xff0c;主要是为了更好的理解QT中C的语法&#xff0c;方便在QT中理解其中的内容。 目录 第一&#xff1a;C语言新特性 第二&#xff1a;C之命令空间namespace 第三&#xff1…

SQL基本操作

select 查询user表中的所有数据 select * from user查询user表中的所有username和password数据 select username,password from userinsert into 表名 (字段名,…) values (字段值,…) 在user表中插入username为tony stark|password为098123的数据 insert into user (usernam…

【关于C++中----继承】

文章目录一、继承的概念和意义二、基类和派生类对象复制转换三、继承中的作用域四、派生类的默认成员函数五、继承与友元六、继承与静态成员七、复杂的菱形继承及菱形虚拟继承八、继承的总结和反思一、继承的概念和意义 继承(inheritance)机制是面向对象程序设计使代码可以复用…

【自学Java】Java语言数组

Java语言数组 Java语言数组教程 Java 语言 的数组是一个由固定长度的特定类型元素组成的集合。它们的数据类型必须相同&#xff0c;声明变量的时候&#xff0c;必须要指定参数类型。 Java语言数组定义 语法 数据类型 数组名[] null; //声明一个一维数组 数组名 new 数据…

连接直流开关的固态继电器

介绍 在基于MOSFET的继电器中&#xff0c;交流和直流信号都可以被切换。输出利用了两个n通道类型的mosfet。当控制交流负载时&#xff0c;其中一个MOSFET用于切换交流循环的正相&#xff0c;而另一个用于切换负相。当控制直流负载时&#xff0c;只需要一个MOSFET&#xff0c;…

第四十讲:神州防火墙的基本知识

一、认识防火墙的外观特征&#xff1a; DCFW-1800S-H-V2硬件防火墙属于神州数码DCFW-1800系列安全网关家族中的一员&#xff0c;外型尺寸为442mm240.7mm44.0mm&#xff0c;可以安装在19英寸标准机柜中使用&#xff0c;也可以独立卧式使用。 前面板介绍 DCFW-1800S-H-V2安全网…

How we redesigned the NSQ- 其他特性及未来计划

在系列文章前面几篇中&#xff0c;介绍了NSQ改造的过程和几个基础特性&#xff0c;本文中我们继续介绍几个高级特性及其使用场景&#xff0c;这些都是结合有赞业务场景总结提炼出来的重要功能。 NSQ拓展消息格式的设计 有赞中间件在NSQ中引入了支持拓展内容的消息格式&#x…

SAP 【ABAP】采购申请审批增强Demo <转载> (BADI : ME_REQ_POSTED )

原文链接&#xff1a;https://saper.blog.csdn.net/article/details/128121798?spm1001.2014.3001.5502 需求&#xff1a;将审批通过后的采购申请信息推送至外部系统。 分析&#xff1a;当前SAP中有外部系统调用自定义函数审批的情况&#xff0c;也有手动单个/批量审批的情况…

技术分享 | 新手如何调试 OceanBase

作者&#xff1a;郭奥门 爱可生 DBLE 研发成员&#xff0c;负责分布式数据库中间件的新功能开发&#xff0c;回答社区/客户/内部提出的一般性问题。 本文来源&#xff1a;原创投稿 *爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注…

CRM-客户管理系统demo制作文档

一、简介1.1、案例简介本文将介绍&#xff0c;如何搭建CRM-客户管理。1.2、应用场景CRM-客户管理应用完整记录所有客户资料&#xff0c;合理的对客户进行领取、分配、退回、跟进&#xff0c;实现客户管理智能化。二、设置方法2.1、表单搭建1&#xff09;新建主表【新增客户】表…

JDBC的Dao层设计

前言 在前面的博文中JDBC基础使用写增删改查会出现很多重复代码&#xff0c;可以将重复代码提取出来。 一、设计JDBC 层次结构&#xff1a; 项目结构&#xff1a; 二、BaseDao 2.1、将资源提取到文件 在database.properties中将需要的资源放入其中&#xff1a; mysqlDriv…

安科瑞医疗IT系统在医院安全用电中的应用实例

【摘要】根据现代医院建筑发展的趋势和特点&#xff0c;结合医疗 IT系统的工作原理&#xff0c;对医疗 IT系统作了简要介绍&#xff0c;并对IT系统在医院安全用电的具体应用进行了分析。通过工程实例详细探讨了医疗 IT系统在安装和配电方面应注意的问题和细节。 【关键词】IT…

C++ 语法基础课6 —— 函数

文章目录1. 函数基础1.1 编写函数1.2 调用函数1.3 形参和实参1.4 函数的形参列表1.5 函数返回类型1.6 局部变量、全局变量与静态变量2. 参数传递2.1 传值参数2.2 传引用参数(可以改变实参)2.3 数组形参(可以修改函数外数组)2.3.1 一维数组形参2.3.2 多维数组形参2.4 函数重载2.…

expdp导sys用户表时报错ORA-39166、ORA-31655

问题描述&#xff1a;expdp导sys用户表时报错ORA-39166、ORA-31655&#xff0c;如下所示&#xff1a; [oracleoel~]$ expdp \/ as sysdba\ directoryDATA_PUMP_DIR dumpfiletest.dmplogfileexpdp.log tablestest Export:Release 11.2.0.4.0 - Production on Tue Nov 29 14:08:…

麒麟 docker 自启动失败

docker 问题描述&#xff1a; 自启动时出现超时问题 start operation timed out. Terminating 排查流程&#xff1a; journalctl -u docker.service .... modulegrpc Jan 04 11:17:13 control03-55 dockerd[4466]: time"2023-01-04T11:17:13.30274997408:00" leve…