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.jspath.basename(__filename, '.js') // pathpath.basename(__filename, '.css') // pathpath.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) // .jspath.extname('/a/b') // 返回空path.extname('/a/b/index.html.js.css') // .csspath.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 写文件
// writeFilefs.writeFile('data.txt', '1223', function (error, data) {if(!error){console.log('写入成功!')}})// appendFilefs.appendFile('data.txt', 'hello node.js',{}, (err) => {console.log('写入成功')})
5、promisify
把callback转换成promise
// promisifyconst { promisify } = require('util')const readFile = promisify(fs.readFile)readFile('./conf.js').then(data=>console.log(data))// fs Promises API node v10const 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());// 合并Bufferconst 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 />
