JS高级--node.js内置模块

文件操作

学习任何语言,文件的操作目录的操作

文件的写入
const fs = require('fs');
fs.writeFile('文件名','写入的内容',回调函数)
文件的追加
fs.appendFile('文件名','增加的内容',回调函数)
文件的读取
fs.readFile(文件名,回调函数)
文件的复制

最早的时候,文件的复制,官方没有提供 api,但是我们也能够实现

实现的思路就是先读后写

 

const fs = require('fs');

fs.readFile('./test.txt',(err,data)=>{
    if(err) throw err;
    fs.writeFile('./F71.txt',data,(error)=>{
        if(error) throw error;
    })
})

 

但是现在,官方已经提供了文件复制的 api

 

const fs = require('fs');
fs.copyFile('./test.txt','./F72.txt',(err,data)=>{
    if(err) throw err;
})
获取文件信息

通过 fs 模块的 stat 方法(status),就可以拿到一个文件的具体信息:

 

const fs = require('fs');
fs.stat('./test.txt',(err,status)=>{
    if(err) throw err;
    console.log(status);
})

有两个方法比较常用:

  • isFile:是否是文件

  • isDirectory:是否为目录

删除文件
const fs = require('fs');
fs.unlink('./F72.txt',()=>{});

目录相关的处理

创建目录
const fs = require('fs');
fs.mkdir(目录名,()=>{})
读取目录
fs.readdir(目录名,回调函数)

 读取一个目录下面的所有文件:

const fs = require('fs');
const path = require('path');
// join 方法使用示例:path.join('a','b') ---->  a/b/
// 该函数就可以读取所有的文件
function showFile(dir) {
    // 首先,通过 readdir 这个方法来读取目录
    fs.readdir(dir, (err, data) => {
        if (err) throw err;
        data.forEach(item => {
            // 下一步就是判断这个 item 是否为文件
            let fileDir = path.join(dir, item);
            fs.stat(fileDir, (err, status) => {
                if (status.isFile()) {
                    // 进入此分支,说明当前是一个文件
                    console.log(item);
                } else {
                    showFile(fileDir);
                }
            })
        })
    })
}
showFile('./F71')

  删除目录的 api(目录为空才能删除)

fs.rmdir(目录名,回调函数)

  删除目录同步版

const fs = require('fs');
const path = require('path');
const delDir = (dir) => {
    // 判断目录是否存在
    if (fs.existsSync(dir)) {
        // 获取到该目录下的所有内容,返回的是一个数组
        const files = fs.readdirSync(dir);
        // 遍历该数组,如果是目录,递归进去;如果是文件,直接删除掉
        files.forEach(function (file, index) {
            const curPath = path.join(dir, file); // 获取绝对路径
            if (fs.statSync(curPath).isDirectory()) {
                delDir(curPath); // 因为是目录,所以再次递归进去
            } else {
                fs.unlinkSync(curPath); // 删除文件
            }
        });
        // 数组遍历完之后,该目录已经变成了一个空目录,将此目录删除掉
        fs.rmdirSync(dir);
    }
}
delDir('./test');

HTTP 模块

在 nodejs 中,提供了一个内置的 http 模块。该模块可以帮助我们快速的搭建一个服务器。

快速入门示例:

const http = require('http');

http.createServer((req,res)=>{
    // 这个回调函数中的 req 代表 http 请求
    // res 代表 http 响应
    res.writeHead(200,{
        'Content-type' : 'text/html;charset=utf-8'
    });
    res.write(`
        <h1>欢迎学习 nodejs</h1>
        <p>这是通过 node服务器访问到的页面</p>
    `);
    res.end(`
        <p>这一次连接已经结束~</p>
    `); // 结束这一次响应
}).listen(3000,()=>{
    console.log('服务器已经启动...')
});

  

获取 get 请求和 post 请求的数据
get 请求

get 请求,数据都是在 URL 后面,所以我们获取到 URL,就等价于获取到了客户端给我传递的数据

 

const http = require('http');
const url = require('url');
// http://www.f71.com/index.html?name=xiejie&age=18
http.createServer((req,res)=>{
    const params = url.parse(req.url, true).query;
    console.log(params);
}).listen(3000,()=>{
    console.log('服务器已经启动...')
});

  post 请求,数据是在请求体里面,所以我们需要从请求体里面去拿数据,只有通过事件监听的方式来拿

const http = require('http');
const url = require('url');

let str = `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
    <form action="" method="POST">
        <div>
            用户名:<input type="text" name="username" id="username">
        </div>
        <div>
            密码: <input type="password" name="userPWD" id="userPWD">
        </div>
        <button>提交</button>
    </form>
</body>
</html>
`


http.createServer((req,res)=>{
    let body = ''; // 用来装请求体里面的数据
    // 每一次有数据到达服务器,都会触发 data 事件
    req.on('data',function(chunk){
        body += chunk;
    })
    // 当触发 end 事件的时候,说明数据已经接收完毕
    req.on('end',function(){
        res.writeHead(200,{
            'Content-type' : 'text/html;charset=utf-8'
        });
        if(body){
            res.end(`已经接收到你输入的内容:${body}`);
        } else {
            res.end(str);
        }
    })
}).listen(3000,()=>{
    console.log('服务器已经启动...')
});

  

使用 http 模块 get 方法来做一个简单的爬虫
const https = require('https');
const cheerio = require('cheerio');

// 爬虫的思路很简单,就是在服务器端通过 http.get 方法来发送请求

https.get('https://tuijian.hao123.com/hotrank',(req)=>{
    let data = ''; // 获取数据
    req.on('data',(chunk)=>{
        data += chunk
    });
    req.on('end',()=>{
        filter(data);
    })
});
// 对数据进行提取
function filter(data){
    let result = []; // 用于存放筛选后的数据
    const $ = cheerio.load(data); // 这个时候它就会生成一个 jquery 对象,我们就可以使用 jquery 的方法来筛选数据
    const arr = $('[monkey="ss"]').find('.point-bd').find('.point-title')
    arr.each((index,item)=>{
        result.push($(item).text());
    })
    console.log(result);
}

  

Buffer 模块和 Stream 模块

Buffer 是一个缓冲区,最早的时候,我们的 JavaScript 只能处理字符串,不能够处理二进制数据

Buffer 相当于是在计算机内存里面开辟了一个内存空间,示例:

let buf = new Buffer.alloc(5);
console.log(buf); // <Buffer 00 00 00 00 00>

  既然创建的这个 buffer 是一段内存空间,那么我们可以往这个空间里面写入数据

let buf = new Buffer.alloc(5);
buf.write('abcd');
console.log(buf); 
Stream 文件流

流的概念

所谓流,就是像水流一样,数据都是二进制,所以在传输的时候,需要一点一点的流过来。比如我们在网络上看电影,下载电影,都是以流的形式,一点一点传输过来的。

在 nodejs 里面,我们就可以操作流

  • 可读流

  • 可写流

首先有几个事件:

  • data:只要可读流还存在数据,就会触发 data

  • end :要操作的流已经没有数据,就会触发 end

  • error:发生错误的时候,会触发 error 事件

 

pipe 方法 

使用 pipe 方法,在处理大文件的时候,非常的方便,相当于在两个流文件直接创建了一个管道

文件压缩

在做 web 开发的时候,我们有时会进行性能优化,其中一条就包含文件压缩。

具体包含以下几个步骤:

(1)在浏览器发送 http 请求的时候,请求头里面会有一个键值对,其中有一个键值是 Accept-Encoding,表示我这个浏览器能够接受的编码格式,如果包含 gzip,说明这个浏览器支持压缩文件的解析。

(2)nodejs中对文件进行压缩

 

 

 

 

 

 

posted @ 2020-12-30 22:32  瓜豆のO泡  阅读(111)  评论(0)    收藏  举报