初学Nodejs(3):http模块

news2024/11/14 14:50:39

初学Nodejs

http模块

1、概念

  • 什么是客户端与服务端
    在网络节点中,负责消费资源的电脑,叫做客户端;负责对外提供网络资源的电脑叫做服务器

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

2、http模块作用

  • 服务器和普通电脑的区别在于,服务器上安装了web服务器软件,例如:IIS、Apache等。通过安装这些服务器软件,就能把一台普通的电脑变成台web服务器。

  • 在Nodejs中,并不需要第三方web服务器软件,因为可以基于nodejs自带的http模块,通过几行简单的代码,就能轻松的手写一个服务器软件,从而对外提供web服务

3、使用http模块创建基本web服务器

3.1 基本步骤

  • 导入http模块
  • 创建web服务器实例
  • 为服务器实例绑定request事件,监听客户端的请求
  • 启动服务器
// 导入http模块
const http = require('http')

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

// 为web服务器绑定request事件,监听客户端请求
server.on('request', function (req, res) {
    // req是请求对象,包含于客户端相关的数据和属性,例如req.url表示客户端请求的URL地址,req.method是客户端的method请求类型
    console.log('someone visit our web server');

    const str1 = `Your request url is ${req.url},and request method is ${req.method}`
    console.log(str1);

    const str2 = `您请求的URL地址是${req.url},请求的method类型为${req.method}`
    // 设置编码,防止中文乱码
    res.setHeader('Content-Type','text/html; charset=utf-8')

    // 向客户端发送指定的内容,并结束这次请求的处理过程
    res.end(str2);

})

// 启动服务器
server.listen(8080, function () {
    console.log('server running at http://127.0.0.1:8080')
})

3.2 req请求对象的使用

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

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

需要注意的是req.url输出的是端口号后面的地址,并不是一个完整地址

3.3 res响应对象的使用

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

// 为web服务器绑定request事件,监听客户端请求
server.on('request', function (req, res) {
    // req是请求对象,包含于客户端相关的数据和属性,例如req.url表示客户端请求的URL地址,req.method是客户端的method请求类型
    console.log('someone visit our web server');
    
    const str = `Your request url is ${req.url},and request method is ${req.method}`
    // 向客户端发送指定的内容,并结束这次请求的处理过程
    res.end(str);
})

3.4 解决中文乱码问题

当调用res.end()方法向客户端发送中文内容的时候会出现乱码问题,此时需要手动设置内容的编码,这里可以通过设置响应头 Content-Type 的值为text/html; charset=utf-8 解决中文乱码问题

res.setHeader(‘Content-Type','text/html;charset=utf-8')
// 为web服务器绑定request事件,监听客户端请求
server.on('request', function (req, res) {
    // req是请求对象,包含于客户端相关的数据和属性,例如req.url表示客户端请求的URL地址,req.method是客户端的method请求类型
    console.log('someone visit our web server');

    const str = `您请求的URL地址是${req.url},请求的method类型为${req.method}`
    res.setHeader('Content-Type','text/html; charset=utf-8')
    // 向客户端发送指定的内容,并结束这次请求的处理过程
    res.end(str);
})

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

1、核心实现步骤
(1)获取请求的url地址
(2)设置下默认的相应内容为 ’404 Nod found’
(3)判断用户请求的是否为/ 或者 其他url地址
(4)判断用户请求的是否为指定页面
(5)设置Content-Type响应头,防止中文乱码
(6)使用res.end()把内容响应给客户端

server.on('request', (req, res) => {
    // 1、获取请求的url地址
    const url = req.url
    
    // 2、设置默认的内容为404 not found
    let content = '<h1>404 Not Found</h1>'
    
    // 3、判断用户请求的url地址,显示对应的页面
    if(url === '/' || url === '/index.html'){
        content = '<h1>首页</h1>'
    }else if(url === '/about.html'){
        content = '<h1>关于页面</h1>'
    }

    // 4、中文乱码处理
    res.setHeader('Content-Type','text/html; charset=utf-8') 
    // 5、服务器响应数据
    res.end(content)
})

3.5.例题

有如下js/html/css实现的动态页面,目录结构如下

- HttpTest根目录
HttpTest/web
HttpTest/web/main.html
HttpTest/web/main.css
HttpTest/web/main.js
HttpTest/server.js

实现的效果为:
请添加图片描述

  • HttpTest/web/main.html
<!DOCTYPE html>
<html lang="en">

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

<body>
    <div class="father">
        <div class="son">

        </div>
    </div>

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

</html>
  • HttpTest/web/main. css
.father {
    width: 300px;
    height: 300px;
    background-color: skyblue;
}

.son {
    width: 100px;
    height: 100px;
    background-color: pink;
} 
  • HttpTest/web/main.js
window.onload = function () {
    var father = document.getElementsByClassName('father')[0];
    father.onclick = function () {
        alert('天蓝色')
    }
    var son = document.getElementsByClassName('son')[0]
    son.onclick = function (event) {
        alert('粉色')
        event.stopPropagation();
    }
}
  • HttpTest/server.js
const fs = require('fs')
const path = require('path')
const http = require('http')

const server = http.createServer()

// 为web服务器绑定request事件,监听客户端请求
server.on('request',(req,res)=>{
    // 获取客户端请求的url地址
    let url = req.url;
    // console.log(url);
    
    // url值有如下:
    /**
     * /web/main.html
     * /web/main.css
     * /web/main.js
     */

    // 将资源的请求url地址映射为文件的存放路径
    const fpath = path.join(__dirname,url)
    // console.log(fpath);
    
    // 根据映射过来的路径读取文件内容
    fs.readFile(fpath,(err,data) => {
        // 如果读取失败,向客户端响应固定的‘错误信息’
        if(err) return res.end('404 not found')
        // 如果读取成功,将读取成功的内容响应给客户端
        res.end(data)
    })
})

上述例题中的访问过程如下图:
在这里插入图片描述

通过访问http://127.0.0.1:8080/web/main.html可以访问到页面,但url地址中需要手动添加一个web文件夹,显得url很长,下面通过优化资源请求访问路径来缩短url

3.5.例题:优化资源请求访问路径

  • HttpTest/server.js
const fs = require('fs')
const path = require('path')
const http = require('http')

const server = http.createServer()

// 为web服务器绑定request事件,监听客户端请求
server.on('request',(req,res)=>{
    // 获取客户端请求的url地址
    let url = req.url;
    console.log(url);
    // url值为如下:
    /**
     * /web/main.html
     * /web/main.css
     * /web/mian.js
     */

    // 将资源的请求url地址映射为文件的存放路径
    // const fpath = path.join(__dirname,url)

// =====================================
    // 优化请求路径
    let fpath = ''

    if(url === '/'){
        fpath = path.join(__dirname,'./web/main.html')
    }else {
        fpath = path.join(__dirname,'./web',url)
    }

    console.log(fpath);
// =====================================

    // 根据映射过来的路径读取文件内容
    fs.readFile(fpath,(err,data) => {
        // 如果读取失败,向客户端响应固定的‘错误信息’
        if(err) return res.end('404 not found')
        // 如果读取成功,将读取成功的内容响应给客户端
        res.end(data)
    })
})

// 启动服务器,监听8080端口
server.listen('8080',() => {
    console.log('server running at http://127.0.0.1:8080');
})

这样就可以直接通过输入路径127.0.0.1/main.html来访问到页面,而不用在路径中手动添加一个web

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

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

相关文章

[附源码]java毕业设计流浪动物救助系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

活动sql语句索引基本优化

前言 最近接到了一个需求开发&#xff0c;然后开发完成以后打算对sql进行一些优化&#xff0c;于是等所有功能开发完成以后对mapper文件里面的sql,和service层的查询语句都摘出来&#xff0c;然后设计了一些索引&#xff0c;下面就来说说一些大概的优化思路&#xff0c;至于mys…

WPF上位机通信组件与Modbus协议

1、Modbus通信方式与分类 - 串口 RS485&#xff08;一主多从&#xff09;&#xff1a;不同的报文格式&#xff1a;ModbusAscii&#xff08;ASCII字符方式进行发送&#xff09;、ModbusRTU&#xff08;Remote Terminal Unit&#xff09; - 以太网&#xff08;TCP点对点&#…

[博士后申请]套磁信的五大误区

博士后申请有一些技巧需要注意&#xff0c;下面就随知识人网一起来看看博士后申请套磁信的五大误区。 误区一&#xff1a;字数越多越好 Email字数控制在200字左右。教授每天处理上百封邮件&#xff0c;简单明了的邮件内容是为别人节约时间的一种礼貌;简短易回复的信件也会加大…

supervisor常见报错问题处理及使用教程

Supervisor 是用Python开发的一套通用的进程管理程序&#xff0c;能将一个普通的命令行进程变为后台daemon&#xff0c;并监控进程状态&#xff0c;异常退出时能自动重启。 官网介绍 Supervisor已经过测试&#xff0c;可以在Linux&#xff08;Ubuntu 9.10&#xff09;&#xf…

MySql常见复合查询(重点)

复合查询&#xff08;重点&#xff09; 多表查询 实际开发中往往数据来自不同的表&#xff0c;所以需要多表查询。本节我们用一个简单的公司管理系统&#xff0c;有三张表 EMP,DEPT,SALGRADE来演示如何进行多表查询。 显示雇员名、雇员工资以及所在部门的名字因为上面的数据来…

如何解决Web前端安全问题?

我国网络技术水平的提升&#xff0c;带动着WEB前端业务量的显著增长&#xff0c;人们对于网络服务的需求也日益复杂&#xff0c;与此同时&#xff0c;越来越多的黑客出现&#xff0c;其攻击水平也有了明显提升&#xff0c;WEB前端也成为了众多黑客进行网络攻击的主要目标。 因…

什么是零代码?零代码与低代码有什么联系与区别?

传统的软件研发方式目前并不能很好地满足企业的需求&#xff1a;人员成本高、研发时间长、运维复杂。 这时零代码或低代码工具出现在市面上并被关注就是必然趋势了。对于不太了解两者的人来说&#xff0c;零代码和低代码是什么&#xff1f;又有什么联系与区别&#xff1f; 01 …

uni小程序——评论、文本域、发送、键盘调起、有值后按钮变色等

一、简介 文本域默认显示一行&#xff0c;最多显示4行&#xff0c;到了4行之后不再增高。 输入值后按钮变色 二、案例演示 三、代码 <template><view><view class"plBox"><textarea auto-height"true" maxlength"-1" :s…

[Linux安装软件详解系列]04 安装Redis

目录1、查看服务器是否已安装Redis2、安装Redis1&#xff09;下载2&#xff09;解压3&#xff09;安装4&#xff09;移动配置文件到安装目录下5&#xff09;配置redis为后台启动6&#xff09;将redis-cli&#xff0c;redis-server拷贝到bin下7&#xff09;启动redis8&#xff0…

RabbitMQ简介及在Linux中安装部署(yum)

一、RabbitMQ简介及其作用 RabbitMQ简介 RabbitMQ是在2007 年发布&#xff0c;是一个在 AMQP(高级消息队列协议)基础上完成的&#xff0c;可复用的企业消息系统&#xff0c;是当前最主流的消息中间件之一。RabbitMQ是一个由erlang开发的AMQP&#xff08;Advanced Message Queu…

Arcpy入门教程01:从零开始制作一个arcpy脚本

从零开始制作一个arcpy脚本 文章目录 需求分析代码实现构造临时工作目录数据处理过程及API解析脚本打包代码封装在红盒子中创建脚本报错提醒 EOL while scanning string literal完整代码需求分析 我们现在有一个GDB存储这西安市各个区的绿地面的GDB,以及碑林区和新城区的行政…

将时间序列转成图像——相对位置矩阵方法 Matlab实现

目录 1 方法 2 Matlab代码实现 3.结果 【若觉文章质量良好且有用&#xff0c;请别忘了点赞收藏加关注&#xff0c;这将是我继续分享的动力&#xff0c;万分感谢&#xff01;】 其他&#xff1a; 1.时间序列转二维图像方法及其应用研究综述_vm-1215的博客-CSDN博客 2.将时…

Nginx实现负载均衡

目录 一、环境准备 1、准备3台centos服务器 2、软件安装 二、负载均衡配置 三、其他分配策略 1、fair&#xff08;第三方&#xff09; 一、环境准备 1、准备3台centos服务器​​​​​​​ 服务器名称主机名IP安装服务备注Nginx反向代理服务器proxy192.168.1.10nginx关…

ES倒排序索引

前言 在学习Elasticsearch的使用前&#xff0c;我们先来了解下es是如何实现全文搜索的。 倒排索引是 Elasticsearch 中非常 重要的索引结构&#xff0c;从 文档单词到文档 ID 的过程 为什么要使用倒排索引 先看下面的商品数据goods id 标题 描述 1 小米手机 小米手机性…

【保姆级】新机器部署Redis

1、登录服务器&#xff0c;如果非root用户则切root用户 sudo su - 2、安装gcc yum install gcc-c 3、在/usr/tmp目录上传redis安装包 4、将安装包移到/opt/byd目录 mv redis-4.0.11.tar.gz /opt/byd 5、解压 & 重命名 tar -xzvf redis-4.0.11.tar.gz mv redis-4.0.11 …

安全狗受邀出席CIS 2022网络安全创新大会

11月16日&#xff0c;由网络安全行业门户Freebuf主办的CIS 2022网络安全创新大会&#xff08;简称CIS&#xff09;在上海主会场顺利开幕。 作为国内云原生安全领导厂商&#xff0c;安全狗也收到邀请出席此次活动。 据悉&#xff0c;此次大会分为上海、北京、深圳等多个会场&am…

Pytorch中的DDP

一. 概览 DDP的原理&#xff1f; 在分类上&#xff0c;DDP属于Data Parallel。简单来讲&#xff0c;就是通过提高batch size来增加并行度。为什么快&#xff1f; DDP通过Ring-Reduce的数据交换方法提高了通讯效率&#xff0c;并通过启动多个进程的方式减轻Python GIL的限制&am…

2022-11-17 mysql列存储引擎-聚合运算中间结果缓存磁盘文件以避免OOM-需求分析

摘要: mysql列存储引擎-聚合运算中间结果缓存磁盘文件以避免OOM-需求分析 关联ISSUE: https://github.com/stoneatom/stonedb/issues/21 需求分析ISSUE: https://github.com/stoneatom/stonedb/issues/949 上下文说明: 当前聚合运算的结果都缓存在了内存的HASH中, 一旦数据量…

数据库等值查询与统计信息

概念 统计信息是为优化器的 cost 估算提供数据支撑&#xff0c;其中很重要的一点需求便是等值查询(EQUALS, IN 等) 场景下的基数估算。考虑以下 Case CREATE TABLE mc_tac_template (ID BIGINT ,NAME varchar(50) NOT NULL,GENDER varchar(10) NOT NULL,PRIMARY KEY (ID),KEY K…