NodeJS基础
浮华与是非 3/30/2024 NodeJS
# 一、Node.js
Node.js 是一个开源的,跨平台的JavaScript运行环境。 也就是说它一个应用程序,可以运行JavaScript。
作用:可以开发服务器应用、开发工具类应用(webpack、vite、bable)、开发桌面端应用(VSCode、Figma、Postman 都是基于electron,而electron是nodejs开发)
# 二、命令行工具
# 1.打开
windows键,输入cmd 或者 win+R 输入 cmd 能打开命令行工具窗口(终端)
# 2.命令结构
命令名称(空格)参数1(空格)参数2
# 3.常用命令
切换命令:
- 切换盘符 c: d:
- 切换到上一级 cd ..
- 切换到指定目录 cd 目录名 查看目录 dir
# 4.执行nodejs
node nodejs文件
# 三、Nodejs语法
![[nodejs核心语法.png]]
# 四、Buffer
# 1、概念
缓冲区,是一个类似于数组的对象,用于表示固定长度的字节序列。 本质是一段内存空间,用于处理二级制数据。
# 2、特点
1.buffer大小固定且无法调整。 2.性能较好,可以直接对计算机内存进行操作。 3.每个元素的大小为1字节(byte)
# 3、使用
# 1.创建buffer
// 通过alloc方式创建一个大小为10字节的Buffer区域,每个位置都会归0
let buf = Buffer.alloc(10);
// 输出为 <Buffer 00 00 00 00 00 00 00 00 00 00>
// 通过alloUnsafe方式创建,通用是10字节,但是不安全,相比较于alloc,
// 它没有每个位置都归0,还存在之前的数据,所以不安全,但是速度快于alloc。
let buf_2 = Buffer.allUnsafe(10);
// from方式,
let buf_3 = Buffer.from("123");
console.log(buf_3);
/**
Buffer.from(string[, encoding])
传入的第一个参数是字符串类型时,Buffer.from会根据字符串的编码(encoding参数,默认是utf8)生成该字符串对应的二进制表示
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 2.操作buffer
// buffer 与字符串的转换
let buf_str = Buffer.from("12342df"); console.log(buf_str.toString());
// 类似数组操作单个元素
let buf = Buffer.from("hello");
console.log(buf[0]); //
console.log(buf[0].toString(2)); // 转换成二进制
// 溢出
buf[0] = 360; // 360的二进制是 0001 0110 1000,给buffer赋值后会出现溢出,舍弃高位值,变成 0110 1000
console.log(buf[0].toString(2));
// 中文,一个utf-8的中文是3个字节
let buf_2 = Buffer.from("你好");
console.log(buf_2);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 五、fs模块
# 1.文件的写入
1.同步
2.异步
# 2.文件的读取
# 六、path模块
# 七、http模块
get请求和post请求的区别
- 作用上,get一般用来请求数据,post一般用来提交数据;
- 参数位置不同,get是url后直接带上,post参数在请求体中;
- post相对于get来说,更安全一点,参数不那么容易泄露;
- get请求大小有限制的,一般是2K,post则没有限制;
# https
http+ssl(secure socket layer 安全套接层),https 可以加密报文,安全的http
# 获取 https 证书
工具地址 : https://certbot.eff.org
步骤:
- 安装好工具
- 管理员运行命令
certbot certonly --statndalone
1
- 创建代码
//https证书目录
let httpsOption = {
key: fs.readFileSync("/etc/letsencrypt/path/to/privkey.pem"),
cert: fs.readFileSync("/etc/letsencrypt/path/to/cert.pem")),
ca: fs.readFileSync("/etc/letsencrypt/path/to/chain.pem"))
}
let server = https.createServer(httpsOption,app);
1
2
3
4
5
6
7
2
3
4
5
6
7
# 八、模块化
定义:将一个复杂的程序按照一定规则(规范) 拆分成多个程序的过程,叫模块化。这些单个的程序叫模块,通常都是独立的。
理解:大的按规则拆分成很多小的。 优点:有助于提高系统的可维护性、可复用性和可扩展性。
# nodejs 暴露写法
module.exports = valueexports.name = value
注意点
module.exports可以暴露任何数据,常见 变量、对象;exports隐式等于module.exports,但不能使用exports = value这种,因为exports = module.exports = {},而require导入的是module.exports的值而不是exports的值,注意,默认exports是等于module.exports的,所以用exports.name = value相当于是module.exports.name = value是没有问题的。
# 导入模块
使用 require(路径) 引入。
注意事项(了解):
- 对于自己创建的模块,建议路径写相对路径,不能省略 ./ 或 ../
- js、json导入时可以不用写后缀,js、json同名且都没写后缀时,先找是不是js文件。c/c++编写的nodejs扩展也可以不写。但建议写上
- 导入其他文件时,会按js类型处理。
- 如果导入的路径是一个文件夹,首先检测文件下 package.json 文件中 main 属性对应的文件,如果存在则导入,如果不存在则会报错。如果main属性不存在,或者 package.json 不存在,则会导入文件下的 index.js 和 index.json,若还是没有则会报错。
# 导入自定义模块的基本流程
- 将相对路径转为绝对路径,定位目标文件
- 缓存检测
- 读取目标文件代码
- 将读取的代码包裹为一个函数并执行(自执行函数)。通过
arguments.callee.toString()查看自执行函数 - 缓存模块的值
- 返回
module.exports的值
arguments.callee 指向的是当前函数对象
# 九、包管理工具
参见[[包管理工具]]
# 十、nvm,node版本控制的工具
参见[[nvm]]
# 十一、Express框架
参见