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
View Code

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'
// }
View Code

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);//总是返回当前文件的绝对路径
View Code

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); // ;
View Code

 

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()一般创建多少长度就是多少长度,而内容所占的空间不定
View Code

 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)
View Code

 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);
View Code

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);
View Code

 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);
  }
);
View Code

 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");
});
View Code

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

 

posted @ 2022-01-23 04:22  还有什么值得拥有  阅读(30)  评论(0编辑  收藏  举报