Node高级进阶学习笔记----Stream与http模块

21 阅读3分钟

1、认识Stream

Stream简单理解就是一连串的字节,可以想象成字节流动的过程

常见的Node中的基本流类型:

①Writable:可以向其写入数据的流(例如:fs.createWriteStream()) ②Readable:可以从中读取数据的流(例如:fs.createReadStream())

所有的流都是eventEmitter的实例(可以调用eventEmitter的方法,比如on,parse等等)

(1)读取流

通过fs.createReadStream实例化一个读取流,可以对读取的文件进行精细化操作

const fs = require('fs');

// 1.通过流读取文件
// 1.1 创建一个读取流
// start:从什么位置开始读
// end:读取到什么位置后结束
// highWaterMark:读了多少个字节对回调函数进行一次回调

const readStream = fs.createReadStream('./aaa.txt', {
    start: 2,
    end: 10,
    highWaterMark: 3
})

// Stream可以对字节的读取进行精准控制
readStream.on('data', (data) => {
    console.log(data);

    // 暂停读取
    readStream.pause();
    setTimeout(() => {
        // 继续读取
        readStream.resume()
    }, 2000)
})

可读流的其他事件:

// 补充其他的事件监听
readStream.on('open', (fd) => {
    // fd是文件描述符
    console.log('文件被打开', fd);
})

readStream.on('end', () => {
    console.log('文件已经读完');
    // 读取完会把文件关闭
})

readStream.on('close', () => {
    console.log('文件读取结束并关闭掉');
})

(2)可写流

通过fs.createWriteStream()对文件进行精细化写入操作

const fs = require('fs');

// 创建一个写入流
const writeStream = fs.createWriteStream('./aaa.txt', {
    flags: 'a+',
    start: 5
})

writeStream.open('fd', (fd) => {
    console.log('文件打开', fd);
})

writeStream.write('coderwhy', (err) => {
    console.log('写入失败:', err);
})

// end方法:用的很多
// 1.操作1:将最后的内容写入到文件中,并且关闭文件
// 2.操作2:关闭文件
writeStream.end('哈哈哈')

(3)pipe(管道)

pipe作用:将可读流读取的数据放到可写流中

使用方法:可读流.pipe(可写流)

const readStream = fs.createReadStream('./bbb.txt')
const writeStream = fs.createWriteStream('./foo.txt')

// 可读流.pipe(可写流)
readStream.pipe(writeStream)

2、http模块

(1)认识Web服务器

(2)开启http服务器

const http = require('http');

// 创建一个http对应的服务器
// 这个回调函数是客户端向服务器发送网络请求来请求资源的时候回调的一个函数
const server = http.createServer((request, response) => {
    // request对象中包括本次客户端请求的所有信息(本质是读取流)
    // 请求的url
    // 请求的method
    // 请求的header
    // 请求携带的数据
    
    // response对象用于给客户端用户返回结果的(本质是写入流)
    response.end('helloworld');
});

// 开启对应的服务器,并且告知需要监听的端口
// 监听端口时,监听1024以上的端口,65535以下的端口
server.listen(8000, () => {
    console.log('服务器开启成功');
})

(3)request对象携带的信息解析

const http = require('http');

const server = http.createServer((req, res) => {
    // request对象包含的信息
    // 1.url
    console.log(req.url);
    // 2.method信息(请求方式)
    console.log(req.method);
    // 3.header信息(请求头)
    console.log(req.headers);

    res.end('hello')
})

server.listen(8000, () => {
    console.log('服务器开启成功');
});

(4)url的处理

一般用于根据不同的url向客户端请求不同的数据

const http = require('http');

const server = http.createServer((req, res) => {
    const url = req.url

    // 根据不同的url向客户端请求不同的数据
    if (url === '/login') {
        res.end('登陆成功')
    } else if (url === '/products') {
        res.end('商品列表')
    }

    res.end('hello')
})

server.listen(8000, () => {
    console.log('服务器开启成功');
});

(5)method的处理

method指发送信息的方法,一般是GET或者POST

const http = require('http');

const server = http.createServer((req, res) => {
    const url = req.url
    const method = req.method

    // 根据不同的url向客户端请求不同的数据
    if (url === '/login') {
        if (method === 'POST') {
            res.end('登陆成功')
        } else {
            console.log('不支持的请求方式');
        }
    } else if (url === '/products') {
        res.end('商品列表')
    }

    res.end('hello')
})

server.listen(8000, () => {
    console.log('服务器开启成功');
});

(6)request参数解析

const http = require('http');
const qs = require('querystring');

const server = http.createServer((req, res) => {
    // 1.参数1:query类型参数
    const urlString = req.url
    // 1.1对urlString进行解析
    const urlInfo = urlString.parse(urlString)
    console.log(urlInfo.query, urlInfo.pathname);
    // 打印出来是 offset=100&size=20 /home/list

    // 1.2解析query:offset=100&size=20
    const queryString = urlInfo.query
    const queryInfo = qs.parse(queryString)
    console.log(queryInfo);
    console.log(queryInfo.offset, queryInfo.size);
  
    res.end('hello')
})

server.listen(8000, () => {
    console.log('服务器开启成功');
});

(7)body参数解析

request监听data函数的变化,如果data触发会调用回调函数,获取到request的body参数

const server = http.createServer((req, res) => {
    // 获取参数:body参数(请求体)
    // request本质上是一个可读流
    req.setEncoding('utf8');

    req.on('data', (data) => {
        console.log(data);
    })

    req.on('end', () => {
        console.log('登陆成功');
    })

    res.end('hello')
})