node 基础 之 http模块

197 阅读5分钟

4:http模块


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


4.1:使用http模块

使用步骤如下:

  1. 导入http模块
  2. 创建web服务器实例
  3. 为服务器实例绑定request事件,监听客户端的请求
  4. 启动服务器
//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');
});

1:req请求对象:

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

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);
});

2:res响应对象:

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

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

3.解决中文乱码问题

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

server.on('request',(req,res)=>{
  //发送的内容包含中文
const str = `您请求的url地址是${req.url},请求的method 类型是${req.method}`;
//为了防止中文显示乱码问题,需要设置响应头 Content-Type的值为text/html;charset=utf-8
res.setHeader('Content-Type','text/html;charset=utf-8')
//把包含中文的内容响应给客户端
res.end(str)
});

4.总体代码:

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.setHeader('Content-Type','text/html; charset=utf-8');
 // 调用 res.end()方法,向客户端响应一些内容
 res.end(str);
});
​
server.listen(8080,function(){
 console.log('server running at http://127.0.0.1:8080');
});

4.2:根据不同url响应不同的html内容

实现步骤如下:

  • 获取请求的url地址
  • 设置默认的响应内容为404 Not Found
  • 判断用户请求的是否为/ 或 /index.html首页
  • 判断用户请求是否为/about.html关于页面
  • 设置Content-Type响应头,防止中文乱码
  • 使用res.end()把内容响应给客户端
const http = require('http');
​
const server = http.createServer();
​
server.on('request',(req,res)=>{
    //1. 获取请求的url地址
    const url = req.url 
    console.log(url);
    //2. 设置默认的响应内容为 404 Not Found
    let content = '404 Not Found'
    //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(8080,function(){
    console.log('server running at http://127.0.0.1:8080');
 });

4.3http综合案例

案例思路:

就是把自己写的Web服务器 作为一个中转站, 本身浏览器和磁盘目录的东西没有办法关联在一起,但是通过服务器 能 读取磁盘目录的文件 ,然后浏览器向服务器请求,读取完毕之后 就 响应给浏览器。(可以直接画图理解,这里就不做过多解释)

实现的步骤如下:

  1. 导入需要的模块
//1.1导入http模块
const http = require('http');
//1.2导入 fs 文件系统模块
const fs = require('fs');
//1.3导入path路径处理模块
const path = require('path');
  1. 创建基本的web服务器
//2.1创建web服务器
const server = http.createServer();
//2.2监听web服务器的request事件
server.on('request',function(req,res){});
//2.3启动 web 服务器
server.listen(8080,function() {
  console.log('server listen at http://127.0.0.1');
})
  1. 将资源的请求 url 地址映射为文件的存放路径
//3.1 获取到客户端请求的 url 地址
const url = req.url;
//3.2 把请求 的 url地址,映射为本地文件的存放路径
const fpath = path.join(__dirname,url);
  1. 读取文件内容并响应给客户端
//4.1 根据 "映射" 过来的文件路径读取文件
fs.readFile(fpath,'utf8',(err,dataStr)=>{
  //4.2 读取文件失败后,向客户端响应固定的"错误信息"
  if(err) return res.end('404 Not Found');
  //4.3 读取文件成功后,将"读取成功的内容"响应给客户端
  res.end(dataStr)
})
  1. 优化资源的请求路径
//5.1与定义空白的文件存放路径
let path = ''
if(url === '/') {
  //5.2 如果请求的路径是否为 /,则手动指定文件的存放路径
  fpath = path.join(__dirname,'./clock/index.html')
}else {
  //5.3 如果请求的路径不为/, 则动态拼接文件的存放路径
  fpath = path.join(__dirname,'./clock',url)
}

总代码:

//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 服务器的 requets事件
server.on('request',(req,res)=>{
    //3.1获取请求url地址
    const url = req.url;
    //3.2把请求的URL 地址映射为具体文件的存放路径
    // const fpath = path.join(__dirname,url);
    let fpath = ''
    if(url === '/') {
        fpath = path.join(__dirname,'./clock/index.html')
    }else {
        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(8080,()=>{
    console.log('server running at http://127.0.0.1:8080');
});
​

小总结: 这一节是跟前面的联动,在看这一章节的时候可以适当复习上一节发布的东西,这里所有的知识都是出自于黑马node的教程,如有需求请去b站大学寻找,🔗链接放在这里了:www.bilibili.com/video/BV1a3…