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 模块
快速入门示例:
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 请求,数据都是在 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('服务器已经启动...')
});
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中对文件进行压缩

浙公网安备 33010602011771号