node入门
process 进程 常用
 
/* argv argv0 execArav execPath */ const {argv,argv0,execArgv,execPath}=process; argv.forEach(item => { console.log(item); }); console.log(argv0); console.log(execArgv);//[] console.log(execPath);//G:\nodejs\node.exe setImmediate(()=>{ console.log('setImmediate') });//当前事件队列执行完后,下一个事件循环时执行 setTimeout(()=>{ console.log('setTimeout') },0);//当前事件队列执行完后,下一个事件循环时执行 process.nextTick(()=>{ console.log('nextTick') process.nextTick(()=>{ console.log('nextTick') }) //如果内部继续调用则继续执行process.nextTick(callback);是其他的 则排队到后面 });//当前事件队列执行完后,下一个事件循环时执行 //三个执行顺序 先执行 process.nextTick() 在执行setTimeout/setInterval 最后执行setImmediate
env 系统执行环境
 
const {env}=process;
console.log(env);//当前系统的执行环境
// {
//   ALLUSERSPROFILE: 'C:\\ProgramData',
//   ANDROID_HOME: 'G:\\SDK',
//   APPDATA: 'C:\\Users\\Administrator\\AppData\\Roaming',
//   CHROME_CRASHPAD_PIPE_NAME: '\\\\.\\pipe\\crashpad_15716_ZGPQBZKVQSBUSSFK',
//   CLASS_PATH: '.;C:\\Program Files\\Java\\jdk1.8.0_45\\lib\\dt.jar;C:\\Program Files\\Java\\jdk1.8.0_45\\lib\\tools.jar ',
//   COLORTERM: 'truecolor',
//   COMMONPROGRAMFILES: 'C:\\Program Files\\Common Files',
//   COMPUTERNAME: 'DESKTOP-2Q0S8F5',
//   COMSPEC: 'C:\\Windows\\system32\\cmd.exe',
//   'CommonProgramFiles(x86)': 'C:\\Program Files (x86)\\Common Files',
//   CommonProgramW6432: 'C:\\Program Files\\Common Files',
//   DriverData: 'C:\\Windows\\System32\\Drivers\\DriverData',
//   EXEPATH: 'G:\\Git\\bin',
//   FPS_BROWSER_APP_PROFILE_STRING: 'Internet Explorer',
//   FPS_BROWSER_USER_PROFILE_STRING: 'Default',
//   GIT_ASKPASS: 'c:\\Users\\Administrator\\AppData\\Local\\Programs\\Microsoft VS Code\\resources\\app\\extensions\\git\\dist\\askpass.sh',
//   HOME: 'C:\\Users\\Administrator',
//   HOMEDRIVE: 'C:',
//   HOMEPATH: '\\Users\\Administrator',
//   JAVA_HOME: 'C:\\Program Files\\Java\\jdk1.8.0_45',
//   LANG: 'zh_CN.UTF-8',
//   LOCALAPPDATA: 'C:\\Users\\Administrator\\AppData\\Local',
//   LOGONSERVER: '\\\\DESKTOP-2Q0S8F5',
//   MAVEN_HOME: 'G:\\Maven\\Maven\\apache-maven-3.8.2',
//   MSYSTEM: 'MINGW64',
//   NODE_PATH: 'G:\\nodejs\\node_global',
//   NUMBER_OF_PROCESSORS: '4',
//   OLDPWD: 'H:/node_all/node',
//   ORIGINAL_XDG_CURRENT_DESKTOP: 'undefined',
//   OS: 'Windows_NT',
//   PATH: 'G:\\Git\\mingw64\\bin;G:\\Git\\usr\\bin;C:\\Users\\Administrator\\bin;C:\\ProgramData\\Oracle\\Java\\javapath;C:\\Program Files (x86)\\Common Files\\Oracle\\Java\\javapath;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0;C:\\Windows\\System32\\OpenSSH;G:\\nodejs;G:\\vscode\\Microsoft VS Code\\bin;G:\\python;G:\\electerm\\electerm-1.14.0-win-x64-loose\\electerm.exe;G:\\Google\\Chrome\\Application\\chrome.exe;C:\\Program Files\\Java\\jdk1.8.0_45\\bin;G:\\mysql-5.7.35-winx64\\bin;G:\\Maven\\Maven\\apache-maven-3.8.2\\bin;C:\\Program Files\\Java\\jdk1.8.0_45\\jre\\bin;G:\\Git\\usr\\bin;G:\\Google\\Chrome\\Application\\chrome;G:\\nodejs\\node_global;G:\\nodejs\\node_global;G:\\python\\Scripts;G:\\wechatOpen\\微信web开发者工具\\dll;G:\\SDK;G:\\SDK\\emulator;G:\\SDK\\platform-tools;G:\\nodejs\\node_global;C:\\Users\\Administrator\\AppData\\Local\\Microsoft\\WindowsApps;C:\\Users\\Administrator\\AppData\\Local\\Programs\\Microsoft VS Code\\bin;C:\\Users\\Administrator\\.dotnet\\tools',
//   PATHEXT: '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC',
//   PLINK_PROTOCOL: 'ssh',
//   PROCESSOR_ARCHITECTURE: 'AMD64',
//   PROCESSOR_IDENTIFIER: 'Intel64 Family 6 Model 94 Stepping 3, GenuineIntel',
//   PROCESSOR_LEVEL: '6',
//   PROCESSOR_REVISION: '5e03',
//   PROGRAMFILES: 'C:\\Program Files',
//   PS1: '\\[\\033]0;$TITLEPREFIX:$PWD\\007\\]\\n\\[\\033[32m\\]\\u@\\h \\[\\033[35m\\]$MSYSTEM \\[\\033[33m\\]\\w\\[\\033[36m\\]`__git_ps1`\\[\\033[0m\\]\\n$ ',
//   PSModulePath: 'C:\\Program Files\\WindowsPowerShell\\Modules;C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\Modules',
//   PUBLIC: 'C:\\Users\\Public',
//   PWD: 'H:/node_all/node/oneday',
//   ProgramData: 'C:\\ProgramData',
//   'ProgramFiles(x86)': 'C:\\Program Files (x86)',
//   ProgramW6432: 'C:\\Program Files',
//   SESSIONNAME: 'Console',
//   SHLVL: '1',
//   SYSTEMDRIVE: 'C:',
//   SYSTEMROOT: 'C:\\Windows',
//   TEMP: 'C:\\Users\\Administrator\\AppData\\Local\\Temp',
//   TERM: 'xterm-256color',
//   TERM_PROGRAM: 'vscode',
//   TERM_PROGRAM_VERSION: '1.63.2',
//   TMP: 'C:\\Users\\Administrator\\AppData\\Local\\Temp',
//   USERDOMAIN: 'DESKTOP-2Q0S8F5',
//   USERDOMAIN_ROAMINGPROFILE: 'DESKTOP-2Q0S8F5',
//   USERNAME: 'Administrator',
//   USERPROFILE: 'C:\\Users\\Administrator',
//   VSCODE_GIT_ASKPASS_EXTRA_ARGS: '--ms-enable-electron-run-as-node',
//   VSCODE_GIT_ASKPASS_MAIN: 'c:\\Users\\Administrator\\AppData\\Local\\Programs\\Microsoft VS Code\\resources\\app\\extensions\\git\\dist\\askpass-main.js',
//   VSCODE_GIT_ASKPASS_NODE: 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Microsoft VS Code\\Code.exe',
//   VSCODE_GIT_IPC_HANDLE: '\\\\.\\pipe\\vscode-git-b2826587c7-sock',
//   WINDIR: 'C:\\Windows',
//   _: 'G:/nodejs/node',
//   __COMPAT_LAYER: 'RunAsAdmin'
// }
path 基本用法 process.cwd() ; __dirname;__filename的区分
 
/* normalize() 可以识别写的不规范又瑕疵的路径转换成规范化路径 join() 拼接路径 resolve() 相对路径转换成绝对路径 basename() 文件名 extname() 文件拓展名 dirname() 文件路径 parse() 将路径转换成对象 format() 讲对象转换程字符串形式 process.cwd();// 总是返回执行node命令所在文件夹 __dirname; // 总是返回当前文件所在文件夹绝对路径 __filename; //总是返回当前文件的绝对路径 */ const { normalize, join, resolve,basename,extname,dirname,parse,format } = require("path"); console.log(normalize("/user//local/bin"));//\user\local\bin 转换不规范的路径 console.log(join('/user','local','bin'));//\user\local\bin console.log(join('/user','../local','bin/'));//\local\bin\ console.log(resolve('./'));//H:\node_all\node\oneday const filePath='/usr/local/bin/no.txt' console.log(basename(filePath));// no.txt console.log(extname(filePath));// .txt console.log(dirname(filePath));// /usr/local/bin let result=parse(filePath); console.log(result); // { // root: '/', // dir: '/usr/local/bin', // base: 'no.txt', // ext: '.txt', // name: 'no' // } console.log(format(result));// /usr/local/bin\no.txt console.log('process.cwd(): ',process.cwd());// 总是返回执行node命令所在文件夹 console.log('__dirname: ',__dirname);// 总是返回当前文件所在文件夹绝对路径 console.log('__filename: ',__filename);//总是返回当前文件的绝对路径
path windows环境 与linux环境 定界符,分隔符 及在任何操作系统上获得一致的结果如何使用
 
/* sep 提供特定于平台的路径片段分隔符: Windows 上是 \ POSIX 上是 / delimiters 提供特定于平台的路径定界符: ; 用于 Windows : 用于 POSIX win32 当使用 Windows 文件路径时,若要在任何操作系统上获得一致的结果,则使用 path.win32: posix 当使用 POSIX 文件路径时,若要在任何操作系统上获得一致的结果,则使用 path.posix: */ const {sep,delimiter,win32,posix}=require("path"); console.log("sep: ",sep);// \ console.log("win sep: ",win32.sep);// \ console.log("path: ",process.env.PATH); //进程执行的系统环境 console.log("delimiter: ",delimiter); // ; console.log("delimiter: ",win32.delimiter); // ;
Buffer基本用法
- Buffer.alloc()
- Buffer.from()
- Buffer.byteLength()
- Buffer.isBuffer()
- Buffer.concat()
 
/* Buffer 用于处理二进制数据流 实例雷士整数数组,大小固定 C++代码在V8堆外分配物理内存 //创建Buffer对象的方法 Buffer.alloc();//创造的Buffer对象 声明了多少空间 就占多少空间 与内容所占的空间不一定相等 Buffer.from();//创建的Buffer对象 有多少内容占据多少空间 Buffer.byteLength() 查看Buffer所占的字节 Buffer.isBuffer() 检测对象是不是Buffer对象 Buffer.concat() 拼接Buffer对象 传入的参数需要是个数组 */ const {Buffer}=require("buffer") //创造长度为10的以0填充的缓冲区 const buf1=Buffer.alloc(10);//<Buffer 00 00 00 00 00 00 00 00 00 00> //创造长度为10的以1填充的缓冲区 const buf2=Buffer.alloc(10,1); // <Buffer 01 01 01 01 01 01 01 01 01 01> // 创建长度为 10 的未初始化的缓冲区。 // 这比调用 Buffer.alloc() 快, // 但返回的缓冲区实例可能包含旧数据, // 需要使用 fill()、write() 、 // 或其他填充缓冲区内容的函数重写。 const buf3 = Buffer.allocUnsafe(10);//<Buffer 00 00 00 00 00 00 00 00 88 41> // 创建包含字节 [1, 2, 3] 的缓冲区。 const buf4=Buffer.from([1,2,3]);//<Buffer 01 02 03> console.log(buf4) // 当在 Buffer 和字符串之间进行转换时,可以指定字符编码。 如果未指定字符编码,则默认使用 UTF-8 const buf = Buffer.from('hello world', 'utf8');//<Buffer 68 65 6c 6c 6f 20 77 6f 72 6c 64> console.log(buf) console.log(Buffer.byteLength("test"));//4 console.log(Buffer.byteLength("测试"));//6 console.log(Buffer.isBuffer({}));// false console.log(Buffer.isBuffer(Buffer.from([1,2,3,4,5])));//true const newBuf1=Buffer.from('this '); const newBuf2=Buffer.from('is '); const newBuf3=Buffer.from('a '); const newBuf4=Buffer.from('test '); const newBuf5=Buffer.from('!'); const newBuf6=Buffer.concat([newBuf1,newBuf2,newBuf3,newBuf4,newBuf5]); console.log(newBuf6.toString());//this is a test ! console.log(newBuf6.length);//16 16长度代表申请的空间是16 (Buffer.from())一般用多少创建Buffer的时候申请多少空间,Buffer.alloc()一般创建多少长度就是多少长度,而内容所占的空间不定
Buffer对象常用方法
- buf.toString()
- buf.fill()
- buf.equals()
- buf.indexOf()
- buf.copy()
 
/* buf 常用方法 buf.toString() 将buf对象转换成字符串形式 buf.fill() 往buf对象中填充内容 buf.equals() 比较buf对象的内容是不是相等 不是比较内存是不是相等 buf.indexOf() buf对象是个类数组 它也可以使用其他数组的方法 这里只展示indexOf() buf.copy() buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]]) */ const { Buffer } = require("buffer"); const buf = Buffer.from("this is a test !"); console.log(buf.toString());// this is a test ! const buf2=Buffer.allocUnsafe(10); buf2[0]=2; console.log(buf2.length);//10 console.log(buf.toString('base64'));// dGhpcyBpcyBhIHRlc3QgIQ== 将buf对象转换成base64格式的字符串样式 const buf3=Buffer.allocUnsafe(10);//创建10个长度的Buffer对象 内部用16进制填充 console.log(buf3);//<Buffer 00 00 00 00 00 00 00 00 d8 78> console.log(buf3.fill(10,2,6));//<Buffer 00 00 0a 0a 0a 0a 00 00 00 00> const buf4=Buffer.from('test'); const buf5=Buffer.from('test'); const buf6=Buffer.from('test!'); console.log(buf4.equals(buf5));//true 内容一样 console.log(buf4.equals(buf6));//false 内容不一样 console.log(buf4.indexOf('e'));//1 console.log(buf4.indexOf(2));//-1 // 创建两个 `Buffer` 实例。 const buf7 = Buffer.allocUnsafe(26); const buf8 = Buffer.allocUnsafe(26).fill('!'); console.log(buf7) for (let i = 0; i < 26; i++) { // 97 是 'a' 的十进制 ASCII 值。 buf7[i] = i + 97; } console.log(buf7) // 将 `buf1` 字节 16 到 19 复制到 `buf2` 中,从 `buf2` 的字节 8 开始。 buf7.copy(buf8, 8, 16, 20); console.log(buf8)
events事件 基本用法(类似观察者模式) 绑定事件 ; 触发事件; 只触发一次
 
/* 所有触发事件的对象都是 EventEmitter 类的实例。 这些对象暴露了 eventEmitter.on() 函数,允许将一个或多个函数绑定到对象触发的命名事件。 通常,事件名称是驼峰式字符串,但也可以使用任何有效的 JavaScript 属性键。 当 EventEmitter 对象触发事件时,所有绑定到该特定事件的函数都会被同步地调用。 被调用的监听器返回的任何值都将被忽略和丢弃。 以下示例展示了使用单个监听器的简单的 EventEmitter 实例。 eventEmitter.on() 方法用于注册监听器,eventEmitter.emit() 方法用于触发事件。 */ const EventEmitter=require('events'); //继承EventEmitter类 class MyEmitter extends EventEmitter{} //实例化MyEmitter const myEmitter=new MyEmitter(); //eg:1 // // 绑定事件 // myEmitter.on('event',()=>{ // console.log('an event occurred!') // }) // //需要时触发事件 // myEmitter.emit('event'); //eg:2 //// 传递多个参数 //绑定error事件 // myEmitter.on('error',(err,time)=>{ // console.log(err); // console.log(time); // }) // //触发error事件 // myEmitter.emit('error',new Error('warn !!!!'),Date.now()) // once 只触发一次 绑定的自定义事件 myEmitter.once("test",()=>{ console.log('test event'); }) setInterval(()=>{ myEmitter.emit("test"); },500);
events事件 移除事件
 
const EventEmitter = require("events");
class myEvent extends EventEmitter {}
const ce = new myEvent();
function fn1() {
  console.log("fn1");
}
function fn2() {
  console.log("fn2");
}
//给一个事件绑定两个方法
ce.on("test", fn1);
ce.on("test", fn2);
setInterval(() => {
  ce.emit("test");
}, 500);
setTimeout(() => {
  //单独接触某个绑定的方法 传入绑定的事件,和方法名 移除改事件伤的具体方法
  // ce.removeListener('test',fn1)
  //解除所有绑定的方法 传递绑定的事件 移除改事件所有的方法
  ce.removeAllListeners("test");
}, 1500);
fs模块 文件系统
 
const fs = require("fs");
//最好使用异步方法  使用同步方法 遇到多用户 就丧失了nodejs 高并发的优势会造成阻塞
//fs.readFile()
fs.readFile("./Buffer.js", (err, data) => {
  if (err) {
    throw err;
  }
  console.log(data.toString());
});
//fs.writeFile()  使用buffer流的形式
// const content=Buffer.from('this is a test!','utf8')
// fs.writeFile('./write.js',content,(err)=>{
//     if(err){throw err;}
//     console.log('done')
// })
// 使用buffer流的形式
fs.writeFile("./write.js", "hello  world", (err) => {
  if (err) {
    throw err;
  }
  console.log("done");
});
//查看文件/文件夹的状态
fs.stat("./write.js", (err, stats) => {
  if (err) {
    throw err;
  }
  //判断该文件是文件夹
  console.log(stats.isDirectory()); //false
  //判断该文件是文件
  console.log(stats.isFile()); //true
});
//重命名
fs.rename("./write.js", "newwrite.js", (err) => {
  if (err) {
    throw err;
  }
  console.log("done!");
});
//删除文件
fs.unlink("./newwrite.js", (err) => {
  if (err) {
    throw err;
  }
  console.log("newwwrite done!");
});
//读取文件夹
fs.readdir("./", (err, files) => {
  if (err) {
    throw err;
  }
  console.log(files);
});
//创建文件夹
fs.mkdir("./test", (err) => {
  if (err) {
    throw err;
  }
  console.log("test done!");
});
//删除文件夹
fs.rmdir("./test", (err) => {
  if (err) {
    throw err;
  }
  console.log("remove test done!");
});
//监听文件夹
fs.watch(
  "./",
  {
    recursive: true, //是否递归
  },
  (eventType, filename) => {
    console.log(eventType, filename);
  }
);
fs 管道流的形式 读取和写入文件
 
const fs = require("fs");
//读取流的形式
// const rs = fs.createReadStream("./Buffer.js");
// //管道的形式  一边读取 一边输出
// rs.pipe(process.stdout);
// console.log(rs);
//写入
const ws = fs.createWriteStream("./test.txt");
const tid = setInterval(() => {
  const num = parseInt(Math.random() * 10);
  // 数据二进制流的形式 只支持string形式 和Buffer
  if (num < 8) {
    ws.write(num.toString());
  } else {
    clearInterval(tid);
    ws.end();
  }
}, 200);
ws.on("finish", () => {
  console.log("done");
});
promise解决回调地狱的问题 以及async await解决回调地狱的问题
 
const fs=require('fs');
//封装一个promise方法
const promiseFun=(fileName)=>{
    let p=new Promise((resolve,reject)=>{
        fs.readFile(fileName,(err,data)=>{
            if(err){
                reject(err)
            }else{
                resolve(data)
            }
        })
    })
    return p;
}
// //使用promise解决回调地狱的问题
// promiseFun('./443Buffer.js').then((data)=>{
//     console.log(data.toString())
// }).catch((err)=>{
//     console.log(err)
// })
//async await使用
const readFile=async (fileName)=>{
    try{
        const result=await promiseFun(fileName);
        console.log(result.toString())
    }catch(error){
        console.log(error)
    }
}
readFile('./43Buffer.js')
 
                    
                     
                    
                 
                    
                
 
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号