一、前言
本文为nodejs学习记录,包含一些语法和踩坑记,以及一些工具代码技巧等
环境
1 | node v12.16.1 |
二、安装
1. node安装
- 具体下载地址访问官网下载
https://nodejs.org/zh-cn/download/
1 | wget xxxxxx # 下载官网最新二进制文件包 |
2. npm 安装第三方包
2.1. 安装
1 | -g代表全局安装,不加-g安装到本地目录 |
2.2. 更新
1 | 升级npm |
2.3. 只下载源码
1 | 下载mathjax的源码包到当前目录 |
3. nvm 多版本管理
1 | 自行安装nvm,archlinux上可以在archlinuxcn中找到包 |
4. 配置源
1 | 带-g就是全局设置 |
配置源不生效
- 当前目录有
package-lock.json
文件,删掉就好了
三、语法相关(ES6)
1. 变量
1.1. let和var的区别
var | let | |
---|---|---|
作用域 | var可以全局使用 | let只能在代码块中 |
未定义使用 | 定义前使用var,会是undefined类型 | 定义前使用,会报错 |
let特性
- 同作用域下,let前所有调用变量的行为都报错,包括typeof
- let要求有大括号,不允许类似if只有一条语句不加大括号
1.2. const类型
- 大部分同let,有块作用域和不可声明前调用
2. Array 数组
2.1. 一些基础操作
1 | let arr = new Array(); |
2.2. 数组去重
- Set对象类似于数组,但是元素唯一,对数组去重可以使用Set来实现
1 | let arr = [1, 2, 3, 4, 5, 5, 4, 3, 2, 1]; |
2.3. map 遍历数组返回新的数组
1 | > let arr = [1, 2, 3, 4, 5, 6]; |
2.4. filter 遍历数组筛选
1 | > let b = [ undefined, undefined, 6, 7, 8, 9 ] |
2.5. reduce 遍历数组累加
1 | > let b = [ 6, 7, 8, 9 ] |
3. 对象
3.1. 一些基本操作
1 | /****** 遍历对象 ******/ |
3.2. 解构对象
基本赋值
1 | let o = { p: 42, q: tru e}; |
无声明赋值
1 | let a, b; |
1 | 注意:赋值语句周围的圆括号 ( ... ) 在使用对象字面量无声明解构赋值时是必须的。 |
给新的变量名赋值
可以从一个对象中提取变量并赋值给和对象属性名不同的新的变量名。
1 | let o = { p: 42, q: true }; |
默认值
变量可以先赋予默认值。当要提取的对象对应属性解析为 undefined,变量就被赋予默认值。
1 | let { a = 10, b = 5 } = { a: 3 }; |
3.3. 变量作为key
1 | let a = 'aaaaa'; |
4. 异步处理
4.1. Promise
4.1.1 Promise.all
Promise.all()
主要用于将多个异步处理函数整合成一个异步处理,外层使用await可以等待多个异步处理函数处理完成
1. 和数组结合
- 数组遍历每一个item进行处理,如果处理之间不相关,可以使用异步的方式,但是又需要等待处理完成
- 不能使用foreach,因为
Promise.all
依赖返回的Promise对象,foreach是没有返回的
1 | let testArray = []; |
2. 限制并发数
- 如果使用数组的map进行遍历,如果数组元素个数特别多,可能会导致协程个数特别多
- 需要对
Promise.all()
加上数量限制,仅允许一定数量的协程
1 | ; |
5. regExp 正则
5.1. test 测试正则
1 | const binStrReg = /^\\[0-9a-fA-F]{2}$/; |
5.2. exec 匹配返回符合要求的字符串
1 | let str = 'aaabbbaaaccc'; |
- exec只返回第一个,想要返回全部,需要使用while和g来实现
1 | let str = 'aaabbbaaaccc'; |
6. 字符串操作
6.1. 正则
match 匹配输出
1 | let str = 'aaabbbaaaccc'; |
search 匹配输出索引
1 | let str = 'aaabbbaaaccc'; |
replace 替换
1 | let str = 'aaabbbaaaccc'; |
split 字符串分割
1 | let str = 'aaa,bbb|aaa ccc#sss@uuu&ccc'; |
6.2. 字符串切割
1 | let str = 'abcdefghi'; |
6.3. join 使用间隔将字符串数组转字符串
1 | > let str = ['a', 'b', 'c'] |
7. 引用json文件
- 直接引用相对路径的文件即可,加不加后缀一样,会变成对象存到变量中
1 | const testJson = require('./aaa'); |
8. 类型转换
8.1. float到其他
1 | let intVar = Math.floor(2.3); // 向下取整 |
四、技巧
1. 框架
- 服务端后台框架推荐eggjs
2. 交换元素的值
- 使用ES6的解构赋值特性
1 | let x = 1; |
3. jsonSchema的几种用法
3.1. required依赖某一项
1 | const xxxSchema = { |
3.2. callback自定义检查
1 | const xxxSchema = { |
4. 暂停等待用户输入
- 这里只展示同步的,异步的自己裁代码
1 | const readline = require('readline'); |
5. 进度条展示
1 | ; |
6. 时间相关
1 | // 返回当前毫秒级时间戳 |
7. 生成uuid
7.1. 简单生成,不依赖第三方库
1 | function uuid() { |
五、好用的第三方node_module
1. yargs 命令行参数解析
1.1. 一些基本用法
1 | /* eslint-disable no-console */ |
效果
正常
1 | [xxx@xxxx ~]# NODE_PATH=/path/to/node_modules node util.js cmd1 --option_test_1 aaa --option_test_2 |
1 | [xxx@xxxx ~]# NODE_PATH=/path/to/node_modules node util.js cmd1 --option_test_1=aaa --option_test_2 aaa |
异常
1 | [xxx@xxxx ~]# NODE_PATH=/path/to/node_modules node util.js |
1 | [xxx@xxxx ~]# NODE_PATH=/path/to/node_modules node util.js cmd1 |
1 | [xxx@xxxx ~]# NODE_PATH=/path/to/node_modules node util.js aaa cmd1 |
1 | [xxx@xxxx ~]# NODE_PATH=/path/to/node_modules node util.js cmd1 --aaa |
2. cron-parser cron字符串解析
2.1. 基本用法
1 | > const interval = parser.parseExpression('0 0 2 * * *') |
注意事项
- 一旦parser建立后,下一次时间就是建立当时的时间的下一次,如果系统时间改变,不会变更next的结果,用来判断需要小心
3. moment 时间格式化输出
1 | > const moment = require('moment') |
踩坑记
1. 脚本调用promise的函数不会自动退出
1 | const readline = require('readline'); |
- 使用ssh执行
node xxx.js
,ssh不会退出,需要Ctrl + c
才行 - 但是终端中执行
node xxx.js
,会自动退出 - 解决办法是,在最后加上exit();
1 | const readline = require('readline'); |