NodeJS(三)path+http 模块实践

系列文章目录

NodeJS(二)预备知识+fs 实战



前言

前面两篇文章说到了NodeJS的预备知识和fs模块的实战, 本文就说一下path、http 模块的实践。


`

一、path模块

1.1 回顾相对类路径的使用

1.1.1 相对类路径的使用方法

. / 表示当前目录下文件
. . / 上一级目录下文件

1.1.2 相对类路径出现的问题

  1. 出现路径拼接错误的问题。如果所出的路径不恰当,有时候会找不到准确的路径。
    解决:
    1 )可以直接提供一个完整的文件存放路径就行。
    如:
// 移植性非常差、不利于维护
 fs.readFile('C:\\Users\\escook\\Desktop\\Node.js基础\\day1\\code\\files\\1.txt', 'utf8', function(err, dataStr){})

完整的文件路径缺点:移植性非常差、不利于维护。

2 ) 用__dirname 加 “+” 拼接法
__dirname 表示当前文件所处的目录

fs.readFile(__dirname + '/files/1.txt', 'utf8', function(err, dataStr) {})

由于编译原因不建议使用 “+”符号进行拼接。

那么用什么呢? NodeJS 给我们提供了 内置path 模块,里面有个内置函数,path.join() 可以解决拼接问题。

还有许多path 相关的内置函数,专门解决路径 相关的问题。一起来看看吧。

1.2 什么是 path 路径模块?

path 模块是 Node.js 官方提供的、用来处理路径的模块。它提供了一系列的方法和属性,用来满足用户对路径的处理需求。

例如:
path.join() 方法,用来将多个路径片段拼接成一个完整的路径字符串。
path.basename() 方法,用来从路径字符串中,将文件名解析出来。

1.3 path 路径模块的使用

1.3.1 path 路径模块的导入

如果要在 JavaScript 代码中,使用 path 模块来处理路径,则需要使用如下的方式先导入它:

const path = require('path')

1.3.2 路径拼接

使用 path.join() 方法,可以把多个路径片段拼接为完整的路径字符串:
注意:今后凡是涉及到路径拼接的操作,都要使用 path.join() 方法进行处理。不要直接使用 + 进行字符串的拼接。

示例:

fs.readFile(path.join(__dirname, './files/1.txt'), 'utf8', function(err, dataStr) {
  if (err) {
    return console.log(err.message)
  }
  console.log(dataStr)
})

1.3.3 获取路径中的文件名

path.basename() 可以 获取路径中的文件名。
path.basename() 语法格式如下:

path.basename(path[, ext ] )

参数解读:
path 必选参数,表示一个路径的字符串
ext 可选参数,表示文件扩展名
返回: 表示路径中的最后一部分

示例 :

// 定义文件的存放路径
const fpath = '/a/b/c/index.html'

 const fullName = path.basename(fpath)
 console.log(fullName)  // 输出 index.html

const nameWithoutExt = path.basename(fpath, '.html')
console.log(nameWithoutExt)   // 输出 index

1.3.4 获取路径中的文件扩展名

使用 path.extname() 方法,可以获取路径中的扩展名部分,语法格式如下:

path.extname(path)

参数解读:
path 必选参数,表示一个路径的字符串
返回: 返回得到的扩展名字符串

// 这是文件的存放路径
const fpath = '/a/b/c/index.html'

const fext = path.extname(fpath)
console.log(fext) // 输出 .html

二、http 模块

1. 回顾什么是客户端、什么是服务器?

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

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

2. 什么是 http 模块?

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

使用 http 模块,通过几行简单的代码,就能轻松的手写一个服务器软件,从而对外提供 web 服务。

3. 创建 web 服务器

3.1 创建 web 服务器的基本步骤

① 导入 http 模块
② 创建 web 服务器实例
③ 为服务器实例绑定 request 事件,监听客户端的请求
④ 启动服务器

代码如下:

// 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')
})

3.2 req 请求对象

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

/ 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)

})

3.3 res 响应对象

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

server.on('request', (req, res) => {

 const str = `Your request url is ${url}, and request method is ${method}`
 // 调用 res.end() 方法,向客户端响应一些内容
  res.end(str)
  }

3.4 解决中文乱码问题

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

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

4. 根据不同的 url 响应不同的 html 内容

4.1 核心实现步骤

① 获取请求的 url 地址
② 设置默认的响应内容为 404 Not found
③ 判断用户请求的是否为 / 或 /index.html 首页
④ 判断用户请求的是否为 /about.html 关于页面
⑤ 设置 Content-Type 响应头,防止中文乱码
⑥ 使用 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. 判断用户请求的是否为 / 或 /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)
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值