小结
const fs = require('fs');
const path = require('path');
fs.readdir(__dirname, (err, files) => {
files.forEach(file => {
const filePath = path.join(__dirname, file);
if (path.extname(filePath) === '.js') {
fs.readFile(filePath, 'utf8', (err, data) => {
fs.writeFile(filePath, data.replace(/\bconsole\.log\([\s\S]*?\);/g, ''), 'utf8');
});
}
});
});
console.log(path.join('users', 'john', 'documents', 'file.txt'));
console.log(path.join(__dirname, 'users', 'john', 'documents', 'file.txt'));
// 你爹是谁,你是谁
// console.log(__dirname, __filename);
const jsFiles = [];
function walk(dir) {
const files = fs.readdirSync(dir);
files.forEach(file => {
const filePath = path.join(dir, file);
const stats = fs.statSync(filePath);
if (stats.isDirectory()) {
walk(filePath);
} else if (stats.isFile() && path.extname(filePath) === '.js') {
jsFiles.push(filePath);
}
});
}
walk(__dirname);
// makedir
// touch
// rm -rf www/www.js
// process.argv 是一个数组,第一个是node安装目录,第二个是当前执行文件的路径 后面是执行文件配置配置的参数
process.stdin.on('data', e => {
const res = e.toString().trim();
console.log(res + ':' + res);
if (res == 3) {
process.exit();
}
});
// fs.readdir:适用于简单的目录读取需求,适合手动处理文件路径和类型判断。
// glob:适用于需要复杂模式匹配和递归查找文件的场景,提供了更高级的文件查找功能。
// 示例配置对象
const options = {
cwd: __dirname, // 当前脚本所在的目录
ignore: 'node_modules/**', // 忽略 node_modules 目录
dot: true, // 匹配以点(.)开头的文件或目录
nodir: true, // 只匹配文件,不匹配目录
strict: true, // 在遇到文件系统错误时抛出异常
absolute: true, // 返回绝对路径
};
// 只读第一层
const glob = require('glob');
// **/*.js
glob('./*', options, (err, files) => {
console.log(files, 'end');
});
// 读所有层
const glob = require('glob');
glob('./**', { cwd: __dirname }, (err, files) => {
console.log(files, 'end');
});
console.log(111);
process.argv
创建一个文件
touch index.js
删除文件
rm -rf index.js
rm -rf www
npm的淘宝镜像
用npm去下载cnpm包,指定源为https://registry.npmmirror.com
npm install -g cnpm --registry=https://registry.npmmirror.com
下一次使用cnpm i axios
去装包时,他会默认指定registry
为https://registry.npmmirror.com
进程
process.stdin.on("data",e=>{
const res = e.toString().trim()
console.log(res+":"+res);
if(res == 3) {
process.exit()
}
})
node 运行示意图
nodejs的非阻塞I/O
I/O
就是Input/Output
,一个系统的输入和输出- 阻塞
I/O
和非阻塞I/O
的区别就在于系统接受输入再到输出期间,能不能接受其他输入。
// 只读第一层
const glob = require('glob');
glob('./*', {}, (err, files) => {
console.log(files, 'end');
});
// 读所有层
const glob = require('glob');
glob('./**', {}, (err, files) => {
console.log(files, 'end');
});
console.log(111);
事件循环
async await
- async 是promise语法糖封装
- 异步编程的终极解决方案,以同步方式写异步
- await关键字可以暂停 async function 的执行
- await关键字可以以同步的写法获取Promise执行结果
- try-catch 可以获取await所获得的错误
什么是http服务?
- http要做什么事情?
- 解析进来的http请求报文
- 返回对应的http返回报文
node启动一个http服务器
打开浏览器 访问localhost:3000
于是打印出request.url
会有两个结果,一个是/
一个是/favicon.ico
http 返回一个html页面
内置模块url.parse
内置模块querystring
内置模块url.URL
express
koa
- 核心功能比express更加极致,request/response简化
- ctx.status = 200
- ctx.body = “hello”
- express vs koa
- express门槛更低,koa更强大优雅
- express封装更多东西,开发更快速,koa可定制性更高
rpc调用
- remote procedure call (远程过程调用)
- 和ajax有什么相同点
- 都是两个计算机之间的网络通信
- 需要双发约定一个数据格式
- 和ajax有什么不同点
- 不一定使用dns作为寻址服务
- 应用层协议一般不使用http
- 基于tcp或udp协议
- 寻址、负载均衡
-
ajax:使用dns进行寻址
-
rpc:使用特有服务进行寻址
-
- tcp通信方式
- 单工通信,只能由一方 发数据 给 另一方
- 半双工通信,可以从左到右,可以从右到左,但是不可以同时进行
- 全双工通信 ,可以从左到右,可以从右到左,可以同时进行
- 二进制协议
- http协议通信用html,或者json,人类好理解,但是计算机不好理解
- rpc用二进制协议,更小的数据包体积,更快的编解码速度