1、前置概念
异步非阻塞I/O
- 隔壁王大爷(不是隔壁老王,hhhhh~~)有个水壶,王大爷经常用它来烧开水。 王大爷把水壶放到火上烧,然后啥也不干在那等,直到水开了王大爷再去搞别的事情。(同步阻塞)
- 王大爷觉得自己有点憨,不打算等了。把水壶放上去之后大爷就是去看电视,时不时来瞅一眼有没有开 (同步非阻塞)
- 王大爷去买了个响水壶,他把响水壶放在火上,然后也是等着水开,水开的时候水壶会发出声响(异步 阻塞)
- 王大爷又觉得自己有点憨,他把响水壶放在火上然后去看电视,这时他不用是不是来瞅一眼,因为水开 的时候水壶会发出声音通知大爷。(异步非阻塞)
2、运行环境
```javascript // 1 资源:cpu 内存 process.memoryUsage() process.cpuUsage()
// 2 运行环境:运行目录、node环境、cpu架构、用户环境、系统平台 console.log(process.cwd()) console.log(process.version) console.log(process.versions) console.log(process.arch) console.log(process.env.NODE_ENV) console.log(process.env.PATH) console.log(process.env.USERPROFILE) console.log(process.platform)
// 3 运行状态:启动参数、PID、运行时间 console.log(process.argv) console.log(process.argv0) console.log(process.pid)
<a name="J8kYa"></a>
# 3、path
<a name="O6JwM"></a>
## 3.1 获取路径中基础名称
```javascript
/**
* 01 返回的就是接收路径当中的最后一部分
* 02 第二个参数表示扩展名,如果说没有设置则返回完整的文件名称带后缀
* 03 第二个参数做为后缀时,如果没有在当前路径中被匹配到,那么就会忽略
* 04 处理目录路径的时候如果说,结尾处有路径分割符,则也会被忽略掉
*/
path.basename(__filename) // path.js
path.basename(__filename, '.js') // path
path.basename(__filename, '.css') // path
path.basename('/a/b/c') // c
3.2 获取路径目录名
// 返回路径中最后一个部分的上一层目录所在路径
path.dirname(__filename) // /.../上级完整的目录
path.dirname('/a/b/c') // /a/b
3.3 获取路径扩展名
/**
* 01 返回 path路径中相应文件的后缀名
* 02 如果 path 路径当中存在多个点,它匹配的是最后一个点,到结尾的内容
*/
path.extname(__filename) // .js
path.extname('/a/b') // 返回空
path.extname('/a/b/index.html.js.css') // .css
path.extname('/a/b/index.html.js.') // .
3.4 解析路径
/**
* 01 接收一个路径,返回一个对象,包含不同的信息
* 02 root dir base ext name
*/
const obj = path.parse('/a/b/c/index.html')
console.log(obj.root) // /
console.log(obj.dir) // /a/b/c
3.5 路径拼接
console.log(path.join('a/b', 'c', 'index.html')) // a/b/c/index.html
3.6 绝对路径
console.log(path.resolve('index.html')) // /.../index.html
4、文件操作
4.1 读文件
// 同步调用
const data = fs.readFileSync('./a.txt'); //代码会阻塞在这里
// 异步调用
fs.readFile(path.resolve('a.txt'), 'utf-8', (err, data) => {
console.log(err)
if (!null) {
console.log(data)
}
})
4.2 写文件
// writeFile
fs.writeFile('data.txt', '1223', function (error, data) {
if(!error){
console.log('写入成功!')
}
})
// appendFile
fs.appendFile('data.txt', 'hello node.js',{}, (err) => {
console.log('写入成功')
})
5、promisify
把callback转换成promise
// promisify
const { promisify } = require('util')
const readFile = promisify(fs.readFile)
readFile('./conf.js').then(data=>console.log(data))
// fs Promises API node v10
const fsp = require("fs").promises;
fsp
.readFile("./confs.js")
.then(data => console.log(data))
.catch(err => console.log(err));
// async/await
(async () => {
const fs = require('fs')
const { promisify } = require('util')
const readFile = promisify(fs.readFile)
const data = await readFile('./index.html')
console.log('data',data)
})()
6、http服务
// 创建基础服务
const http = require('http');
const server = http.createServer((request, response) => {
console.log('there is a request');
response.end('a response from server');
});
server.listen(3000);
// 写一个请求
const { url, method } = request;
if (url === '/' && method === 'GET') {
fs.readFile('index.html', (err, data) => {
if (err) {
response.writeHead(500, { 'Content-Type': 'text/plain;charset=utf-8' });
response.end('500,服务器错误');
return;
}
response.statusCode = 200; response.setHeader('Content-Type', 'text/html'); response.end(data);
});
} else {
response.statusCode = 404;
response.setHeader('Content-Type', 'text/plain;charset=utf-8'); response.end('404, 页面没有找到');
}
7、Buffer缓冲区
Buffer - 用于在 TCP 流、文件系统操作、以及其他上下文中与八位字节流进行交互。 八位字节组成的数组,可以有效的在JS中存储二进制数据;
// 创建一个长度为10字节以0填充的
const buf1 = Buffer.alloc(10);
console.log(buf1); // <Buffer 00 00 00 00 00 00 00 00 00 00>
// 写入Buffer数据
buf1.write('hello');
console.log(buf1);
// 读取Buffer数据
console.log(buf3.toString());
// 合并Buffer
const buf4 = Buffer.concat([buf1, buf3]);
// 根据数组创建一个buffer对象
let buf1 = Buffer.from([98, 97, 96]) // <Buffer 62 61 60>
// 根据字符串创建buffer对象
let buf2 = Buffer.from('allsll') // <Buffer 61 6c 6c 73 6c 6c>
8、stream
stream - 是用于与node中流数据交互的接口
//二进制,图片操作
const fs = require('fs')
const rs2 = fs.createReadStream('./01.jpg')
const ws2 = fs.createWriteStream('./02.jpg')
rs2.pipe(ws2);
//响应图片请求
const {url, method, headers} = request;
if (method === 'GET' && headers.accept.indexOf('image/*') !== -1) {
fs.createReadStream('.'+url).pipe(response);
}
<br /> <br /> <br /> <br /> <br /> <br /> <br /> <br />