node 模块学习笔记
一、fs模块(文件模块)
首选定义一个日志方法,记录操作的时间节点。
function log(...msg){
const date = new Date();
const dateStr = `[${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()} ${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}]`;
console.log(dateStr, ...msg);
}
1.unlink 删除文件
- promise 实例,其将在异步操作后完成
import {unlink} from 'fs/promises';
try {
await unlink('./temp/hello');
console.log('delete success');
} catch(error) {
console.error('there was an error', error.message);
}
- 回调的形式进行删除,如果删除失败抛出异常,默认第一个参数 error 如果成功则是 null/undefined
import {unlink} from 'fs';
unlink('./temp/hello',(err) => {
if (err) throw err;
console.log('delete success');
});
- 同步的形式进行删除
import {unlinkSync} from 'fs';
try {
unlinkSync('./temp/hello');
console.log('delete success');
} catch(error){
throw new ReferenceError(error.message);
}
注: 如果需要同步操作则需要捕获异常,防止发生线程阻塞.
2.read 读取文件
- 异步操作
const {readFile} = require('fs');
readFile('./test.json',(err, data) => {
if (err) { throw err.message; }
console.log(data.toString());
})
- 同步操作
const {readFileSync } = require('fs');
try {
const data = readFileSync('./test.json');
console.log(data.toString());
} catch(err){
throw err.message;
}
3.write 写入文件
- 同步写入
const { writeFileSync } = require('fs');
try{
writeFileSync('./test.txt', 'hello world');
} catch(err){
throw err.message;
}
- 异步写入
const { writeFile } = require('fs');
const writeContent = 'hello world';
writeFile('./test.txt', writeContent,(err) => {
if (err) { console.error(err); }
console.log('写入成功!');
})
这里默认是如果文件不存在先创建然后写入.
4.watch 监听文件,目录变化
- 监听目录及其下方的子目录
监听器回调有两个参数 (eventType, filename)。 eventType 是 ‘rename’ 或 ‘change’, filename 是触发事件的文件的名称。
const {watch} = require('fs');
// recursive 是否监听子目录,默认为false
watch('./css', {recursive: true},(eventType, filename) => {
console.log(eventType);
console.log(filename);
})
- 监听单个文件的变化
watch('./test.json', (eventType, filename) => {
if (filename){
console.log(`filename:${filename}`);
} else {
console.log('filename not provided');
}
});
二、child_process模块
1.spawn 执行子进程
默认情况下,会在父Node.js 进程和衍生的子进程之间建立 stdin
,stdout
, stderr
的管道。
const { spawn,exec } = require('child_process');
const ls = spawn('node',['-v']);
// 进程执行成功
ls.stdout.on('data',(data) => {
console.log(`stdout: ${data}`);
});
// 进程执行异常
ls.stderr.on('data', (data) => {
console.log(`stderr: ${data}`);
});
// 执行完毕后关闭子进程
ls.on('close',(code)=> {
console.log(`子进程退出,退出码:${code}`);
});
如下图所示:
2.exec 执行子进程
exec 通常用于执行比较复杂的命令,无需像spawn 方法把参数列表传入,参数以空格的形式分开
exec('node -v', (error, stdout, stderr) => {
console.log('**************');
if (error) {
console.error(`exec error ${error}`);
return;
}
console.log(`stdout: ${stdout}`);
if (stderr) {
console.error(`stderr:${stderr}`);
}
});