url模块

  • 官方文档

  • url模块是nodejs里面的一个简单的模块,可以把url网址解析为一个对象

  • 该模块提供三个方法:

    1. url.parse(urlString,boolean,boolean)
    2. url.format(urlObj)
    3. url.resolve(from,to)

1.url.parse(urlString,boolean,boolean)

  • parse这个方法可以将一个url的字符串解析并返回一个url的对象
  • 参数:urlString指传入一个url地址的字符串
  • 第二个参数(可省)传入一个布尔值,默认为false,为true时,返回的url对象中,query的属性为一个对象。这样就方便我们读取前端传过来的query参数
  • 第三个参数(可省)传入一个布尔值, 默认为false//foo/bar 形式的字符串将被解释成 { pathname: ‘//foo/bar’ };如果设置成true//foo/bar 形式的字符串将被解释成 { host: ‘foo’, pathname: ‘/bar’ }

代码展示:

// 引入url模块
const url = require('url')

// 1. parse 方法:将url转化为对象形式
const urlString = 'https://www.baidu.com:443/ad/index.html?id=8&name=mouse#tag=110'
//const parsedStr = url.parse(urlString)//不跟true参数
const parsedStr = url.parse(urlString , true)//跟上true参数
console.log(parsedStr)

结果展示:

  • 当后面不跟true
    image

  • 当后面跟上true
    image

2. url.format(urlObj)

  • format这个方法是将传入的url对象编程一个url字符串并返回

  • 参数:urlObj指一个url对象

代码展示:

// nodeJS内置模块 : url模块
// 引入url模块
const url = require('url')

// 2.format 方法: 将传入的url对项变成一个字符串拼接的url并返回
const urlObject = {
protocol: 'https:',
slashes: true,
auth: null,
host: 'www.baidu.com:443',
port: '443',
hostname: 'www.baidu.com',
hash: '#tag=110',
search: '?id=8&name=mouse',
query: { id: '8', name: 'mouse' },
pathname: '/ad/index.html',
path: '/ad/index.html?id=8&name=mouse'
}
const parsedObj = url.format(urlObject)
console.log(parsedObj)

结果展示:

image

3. url.resolve(from,to)

  • resolve这个方法返回一个格式为”from/to“的字符串,对传入的两个参数用”/“符号进行拼接,并返回

代码展示:

// nodeJS内置模块 : url模块
// 引入url模块
const url = require('url')

// 3.reslove 方法: 将传入的两个参数进行字符串的拼接

// 第一种情况: 后面的参数不加 " / " ,这时就看前面的参收结尾有没有加"/",没有加就是替换,有加就是拼接
var a = url.resolve('/one/two/three', 'four')//替换 , /one/two/four
var b = url.resolve('/one/two/three/', 'one')//拼接 , /one/two/three/one

// 第二种情况: 后面的参数加 " / ", 就会替换掉域名以后的所有内容
var c = url.resolve('http://example.com/one/123/hsk', '/two')//http://example.com/two
console.log(a + "," + b + "," + c)

结果展示:

image

querystring模块

  • 官方文档

  • 作用:对http请求所带的数据进行解析,可以把querystring参数解析为一个对象

  • 该模块提供4个常用方法:

    1. querystring.parse(str,separator,eq,options)
    2. querystring.stringify(obj,separator,eq,options)
    3. querystring.escape(str)
    4. querystring.unescape(str)

1. querystring.parse()

  • parse这个方法是将一个字符串反序列化为一个对象。

  • 参数:

    • str: 指需要反序列化的字符串;
    • separator(可省)指用于分割str这个字符串的字符或字符串,默认值为”&“;
    • eq(可省)指用于划分键和值的字符或字符串,默认值为”=“;
    • options(可省)该参数是一个对象,里面可设置maxKeysdecodeURIComponent这两个属性:

代码展示:

// nodeJS内置模块 : querystring模块
// 引入querystring模块
const querystring = require('querystring')

// 1. parse 方法 将参数转变成对象形式(与stringify方法对立)
var qs = 'x=3&y=4'
var parsed = querystring.parse(qs)
console.log(parsed)
  • 这个方法相当于url模块的第二个参数设置为true,然后取query属性值

2. querystring.stringify()

  • stringify这个方法是将一个对象序列化成一个字符串,与querystring.parse相对。
  • 参数:
    • obj: 指需要序列化的对象
    • separator(可省): 用于连接键值对的字符或字符串,默认值为”&“;
    • eq(可省): 用于连接键和值的字符或字符串,默认值为”=“;
    • options(可省): 传入一个对象,该对象可设: encodeURIComponent这个属性:值的类型为function,可以将一个不安全的url字符串转换成百分比的形式,默认值为querystring.esca

代码展示:

// nodeJS内置模块 : querystring模块
// 引入querystring模块
const querystring = require('querystring')

// 2. stringify 方法将对象形式的参数转变成序列化的url格式(与parse方法对立)
var qo = {
x: 3,
y: 4
}
var parsed = querystring.stringify(qo)
console.log(parsed)

3. querystring.escape(str)

  • escape可使传入的字符串进行编码

代码展示:

// nodeJS内置模块 : querystring模块
// 引入querystring模块
const querystring = require('querystring')

// 3. escape 方法可使传入的字符串进行编码(与unescape方法对立)
var query=querystring.escape("user=肥林")
console.log(query)

4. querystring.unescape(str)

  • unescape方法可将含有%的字符串进行解码

代码展示:

// nodeJS内置模块 : querystring模块
// 引入querystring模块
const querystring = require('querystring')

// 4. unescape 方法可将含有%的字符串进行解码(与escape方法对立)
var query=querystring.unescape("user%3D%E8%82%A5%E6%9E%97")
console.log(query)

结果展示:(4种方法)

image

event模块

  • Events 模块是Node最重要的模块,它提供了一个属性 EventEmitterEventEmitter 的核心是事件发射与事件监听器。
  • Events 模块是Node对 发布订阅模式publish/subscribe)的实现。一个对象通过这个模块,向另一个对象传递消息。
  • 该模块通过 EventEmitter 属性,提供了一个构造函数。该构造函数的实例具有 on 方法,可以用来监听指定事件,并触发回调函数。
  • 任意对象都可以发布指定事件,被 EventEmitter 实例的on方法监听到。

发布订阅模式

  • 订阅方法on 方法用来订阅事件,订阅是将方法对应成一种一对多的关系。
  • 发布方法emit 用来执行订阅的事件。
  • 取消订阅off 方法可以移除对应的事件监听。
  • 订阅一次once 绑定事件当执行后自动删除订阅的事件。

简单的代码实现:

  • event.js
// 内置模块: events模块
// 其实就是简单的消息订阅与发布模式(与Vue中的事件总线非常的相似)

// 实现流程:
// 1.引入event模块
const EventEmitter = require('events')

// 2.实例化event模块
const event = new EventEmitter()

// 3.设置监听事件
event.on('play',(data)=>{//设置一个事件触发标志'play',以及触发后的回调函数
console.log('事件被触发了!',data);
})

// 4.触发事件(并将一些你想要传输的数据发送过去)
event.emit('play','我想发送过去的数据')

结果展示:

image

小案例实现:(结合get请求)

使用get向猫眼电影请求数据,以node为中间转换站解决跨域问题

  • 服务端(get.js)
// 内置模块: http模块 - get模块
// 应用场景: 前端页面通过以node为中间件来向猫眼电影的接口请求数据

// 1.引入http模块和url模块
const http = require('http')
const url = require('url')
const https = require('https')
const EventEmitter = require('events')//相当于Vue里面的事件总线

var event = null//要将event首先定义为null,方便后续变量回收

// 2.创建服务器
http.createServer((req , res)=>{
// 获取网页url参数种的pathname
var urlObj = url.parse(req.url,true)//设置解析true
// 设置cors请求头跨域问题
res.writeHead(200 , {
//设置文本渲染类型
"Content-Type":"application/json;charset=utf-8",
// 设置允许所有跨域请求的cors请求头
"access-control-allow-origin":"*"
})
switch(urlObj.pathname){
case '/maoyan':
httpsget()//向后端请求数据
event = new EventEmitter()//实例化event对象
event.on('play' , (data)=>{//建立事件监听器,监听play
console.log(data);//输出接收到的数据
res.end(data)//将数据发送给前端
})
break;
default :
res.end('404')
}

}).listen(3000 , ()=>{
console.log('服务器已启动,3000端口正在监听!!!');
})

// 设置get请求,向猫眼电影请求数据
function httpsget(){
var data = ""//创建数据接收变量
// 使用https模块向猫眼电影的接口请求数据
https.get(`https://i.maoyan.com/api/mmdb/movie/v3/list/hot.json?ct=%E6%B1%9F%E9%97%A8&ci=277&channelId=4`,res=>{

// 数据接收流程如下:
// 1.设置监听事件来监听数据的接收(数据接收阶段)
res.on("data",(chunk)=>{//接收数据流
data += chunk
})

// 2.数据接收完成发送给前端(数据接收完成)
res.on("end",()=>{//数据接收完毕
console.log(data);
event.emit('play' , data)//数据收集完成使用emit来触发事件
// 切记异步编程不能使用return,使用return返回的是undefined
// 可以使用promise来获取数据
})
})
}
  • 前端页面(get.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>get请求数据(node中间运送数据)</title>
</head>
<body>
<script>
// 服务端已设置好跨域,直接发送请求即可
fetch("http://localhost:3000/maoyan")
.then(res=>res.json())//做json格式的转换,原数据格式为字符串
.then(res=>{
console.log(res);
})
</script>
</body>
</html>

结果展示:

  • 服务端成功输出获取到的数据
    image

  • 前端网页数据也获取成功
    image