node学前
- 前言
- 一、Buffer
- 1.特点
- 2.使用
- 3.buffer读取
- 4.溢出
- 二、文件
- 1.文件写入
- 2.文件追加
- 3.文件读取
- 4.读取和写入
- 4. 文件重命名和移动
- 5.删除文件
- 三、文件夹
- 1.新建文件夹
- 2.读取文件夹
- 3.删除文件夹
- 5.查看文件状态
- nodejs相对路径bug
- 四、网络基础概念
- ip分类
- 五、模块化
- 介绍
- 暴露数据
- 导入文件模块
- CommonJS规范
- 其它
- 创建简单的服务器对象
前言
提示:这个是我自己的学习笔记,记录的都是我觉得不怎么行的,或者是我觉得有用的
这个是我自己的学习笔记
一、Buffer
本质:内存空间
Buffer是一个类似于数组的对象,用于表示固定长度的字节序列。
1.特点
- 大小固定且无法调整
- 性能较好,可以直接对计算机内存进行操作
- 每个元素的大小为1字节(byte)
2.使用
// 1.alloc 分配空间 let buf = Buffer.alloc(10); // console.log(buf) //2. allocUnsafe 速度比1快 不用清理原有内存的内容 let buf2 = Buffer.allocUnsafe(20) console.log(buf2) //3. from 将数据转化成buffer 获取到对应数据的ascll 或 unicode编号 let buf3 = Buffer.from('hello') let buf4 = Buffer.from([105,108,111,118,101,121,111,117]) //4.buffer与字符串转换 console.log(buf4.toString())//输出数据对应的字母。iloveyou
复制
3.buffer读取
可以通过数组下标改变buffer原有的数据
// buffer的读取 let buf3 = Buffer.from('hello') console.log(buf3)//<Buffer 68 65 6c 6c 6f> console.log(buf3[0].toString())//104 console.log(buf3[0].toString(2))//1101000 buf3[0] = 111 console.log(buf3.toString())//oello
复制
4.溢出
buffer一个元素存储的数据大小是8位二进制(255) 如果超过255会造成数据溢出,如果溢出 buffer会舍弃超出部位,留下8位
console.log(buf3[0].toString(2))//1101000 buf3[0] = 365 //0001 0110 1101 console.log(buf3[0].toString(2))//110 1101
复制
二、文件
1.文件写入
当需要持久化保存数据时
写入场景
- 下载文件
- 安装软件
- 保存程序日志
- 编辑器保存文件
- 视频录制
文件写入需要引入fs模块
分为同步和异步,执行效率上,异步比同步高,但是代码逻辑上同步较容易理解
// 引入fs const fs = require('fs') // 异步 fs.writeFile(`./try.txt`, '这是一个写入测试', error => { if (error) { console.log('失败了') return } console.log('成功') }) // 同步 效率 不如异步 fs.writeFileSync('./tryhhh.txt','这个是同步???') console.log('try')
复制
2.文件追加
文件在写入的时候,可以不覆盖前面的内容追加新的文件内容
fs.appendFile('./try.txt', '\r\n 我现在是在追加文件 ', err => { if (err) { console.log('shibai') return } console.log('成功') }) fs.appendFileSync('./try.txt', '你就说能不能换行') fs.writeFile('./try.txt', 'writeFile方式追加写入\r\n',{flag:'a'}, err => { if (err) { console.log('报错啦'); return } })
复制
上述代码中writeFile
在做追加使用的时候,需要有第三个参数 {flag:‘a’} 否则会变成文件覆盖
3.文件读取
// 异步读取文件 fs.readFile('./try.txt', (err, data) => { if (err) { console.log('文件读取失败',err) return; } console.log(data.toString()) }) // 同步读取文件 const data = fs.readFileSync('./tryhhh.txt') console.log(data.toString())
复制
4.读取和写入
- writeFile
// 同步读取文件 const data = fs.readFileSync('./tryhhh.txt') //写入文件 fs.writeFileSync('./tryhhh-2.txt',data) // console.log(data.toString()); console.log(process.memoryUsage())//查看内存使用量 // 输出结果如下:{ // rss: 36093952,//占据所有内存 // heapTotal: 4603904, // heapUsed: 4177760, // external: 1540814, // arrayBuffers: 10519 // }
复制
- 流式操作
const rs = fs.createReadStream('../gwalla.mp4') const ws = fs.createWriteStream('../gwalla-3.mp4') rs.on('data',chunk =>{ ws.write(chunk) }) rs.on('end',() =>{ console.log(process.memoryUsage()); } //输出结果如下 { rss: 53436416, heapTotal: 5652480, heapUsed: 4084864, external: 10320332, arrayBuffers: 8745341 } 读取完成
复制
- 管道
流式操作中的绑定事件rs.on('data',chunkc=>{})
和结束事件rs.on('end',()=>{})
可以用下面的pipe代替
rs.pipe(ws)
复制
4. 文件重命名和移动
文件重命名rename;
通过重命名修改文件路径的方式也可以移动文件所在位置
// 1.调用rename方法 fs.rename('./tryhhh-2.txt', './justry.txt', error => { if (error) { console.log('操作失败') return } console.log('重命名成功') })
复制
5.删除文件
删除文件两种方式。unlink和rm(nodejs内置方法)
fs.unlink('./gwalla-3.mp4', error => { if (error) { console.log('删除失败') return } console.log('删除成功') }) fs.rm('./tryhhh.txt', error => { if (error) { console.log('删除失败') return } console.log('删除成功') })
复制
三、文件夹
1.新建文件夹
fs.mkdir(’filename’,err=>{});
错误处理回调方式同上
2.读取文件夹
fs.readdir(‘filename’,(error,data)=>{})
读取文件有同步和异步方式 ,上面显示的是异步,同步加一个Sync后缀即可实现。
// 读取文件夹 fs.readdir('../09-shangguigu', (error, data) => { if (error) { console.log('操作失败', error) return } console.log('操作成功', data) })
复制
3.删除文件夹
删除文件夹有两种。一种是递归,一种是仅删除单个文件
使用rmdir();仅能删除单个文件夹,如果文件夹中有文件夹可以使用递归删除{ recursive:true }
//删除文件夹 ENOTEMPTY: directory not empty fs.rmdir('./大鱼', error => { if(error) { console.log(error) } }) // 递归删除文件夹 fs.rm('./大鱼/小鱼', { recursive: true }, error => { if (error) { console.log('删除失败'); return } console.log('删除成功') })
复制
5.查看文件状态
通过fs.stat可以查看文件的基本状态信息;
并通过资源状态信息,获取资源类型。
//查看资源状态信息 fs.stat('./file/gwalla.mp4', (err, data) => { if (err) { console.log('状态异常', err) return } console.log('操作成功', data)//查看状态 console.log('查看是否是文件夹',data.isDirectory())//false console.log('查看是否是文件',data.isFile())//true }) // Stats { // dev: 920631484, // mode: 33206, // nlink: 1, // uid: 0, // gid: 0, // rdev: 0, // blksize: 4096, // ino: 1688849861008657, // size: 12273766,//文件大小 // blocks: 23976, // atimeMs: 1704780948595.3694, // mtimeMs: 1697442337712.6338, // ctimeMs: 1704780948265.6382, // birthtimeMs: 1704620277147.2903, // atime: 2024-01-09T06:15:48.595Z,//最后访问时间 // mtime: 2023-10-16T07:45:37.713Z,//最后修改时间 // ctime: 2024-01-09T06:15:48.266Z,//最后修改文件状态时间 // birthtime: 2024-01-07T09:37:57.147Z//创建时间 // }
复制
nodejs相对路径bug
我在本地测试的时候没有发现这个问题
在nodejs中,对于文件的相对路径并非完全按照自己提供的路径;
如提供的路径是"./index.js";理想状态下我们的文件在当前目录下;
实际相对路径的参照目录是命令行工具所在目录;
保险起见,对文件路径的操作使用绝对路径 __dirname
__dirname 对应的是所在文件的所在目录的绝对路径;
==》当前你在操作的这个文件路径
console.log(__dirname) fs.writeFileSync(__dirname + '/index.js', '__dirname')
复制
四、网络基础概念
ip分类
类型 | 说明 |
---|---|
本机回环IP地址 | 127.0.0.0 ~ 127.255.255.254 |
局域网IP(私网IP) | 192.168.0.0 ~ 192.168.255.255 |
局域网IP(私网IP) | 172.6.0.0 ~172.31.255.255 |
局域网IP(私网IP) | 10.0.0.0 ~ 10.255.255.255 |
广域网IP(公网IP) | 除上 |
一个很不错的帖子
五、模块化
介绍
模块化与模块:
将一个复杂的程序文件依据一定规则拆分成多个文件的过程称之为模块化
模块化项目
编码时按照模块一个一个编码的,整个项目就是一个模块化的项目
好处
防止命名冲突
高复用性
高维护性
暴露数据
模块暴露的方式有两种:
1.module.exports = value
2.exports.name = value
注意:
module.exports 可以暴露任意数据
模块内部隐式关系 exports = module.exports = {};
但是不能使用exports=value的形式暴露数据
导入文件模块
在模块中使用require传入文件路径即可
const model = require('./function');
复制
注意:
- 自己创建的模块,导入时建议写相对路径,且不能省略
./
和../
- 如果导入其他类型的文件,会以js文件处理
- js和json文件可以省略后缀名
- 导入路径是文件夹时,会首先检查该文件夹下
package.json
文件中main
属性对应的文件,如果main属性不存在,或者package.json不存在,会检查文件夹下的index.js和index.json;如果依旧没有找到 会报错;
CommonJS规范
module.exports、exports以及require都是CommonJS模块化规范中的内容;
nodejs是实现CommonJS模块化规范,二者关系同JavaScript和ECMAScript相似
其它
HTTP协议默认端口是80;
HTTPS 默认端口443;
HTTP服务开发常用端口:3000,8000,8090,9000等;
创建简单的服务器对象
const http = require('http') // 创建服务器对象 const server = http.createServer((req, res) => { // 设置请求头 // res.setHeader('content-type', 'text/html;charset=utf-8') res.end('你好呀')//每个服务对象中都必须有end() 有且只能一个 }) server.listen(9000, () => { console.log('server start at: http://localhost:9000') })
复制
设置请求头res.setHeader();可以解决中文乱码的问题
如果没有这段代码,浏览器的响应数据如下图