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')