NodeJs-Performance Hooks
小卒子

NodeJs-Performance Hooks

Node.js的PerformanceHooks模块允许开发者通过监控性能测量来分析和优化代码。这一模块提供了与性能相关的API,用于创建时间戳、度量程序执行时间,并提供精确的时间度量。开发者可以使用这些工具来优化应用性能,追踪瓶颈或检查性能基准。本文将详细介绍PerformanceHooks模块的所有属性、方法及其使用方式,涵盖文档的所有内容。1.模块引入PerformanceHooks是Node.js的内置模块之一,可以通过以下方式引入:const{performance,PerformanceObserver}=require('perf_hooks');2.核心概念PerformanceHooks模块基于W3CPerformanceTimelineAPI的规范,允许开发者测量代码性能,记录标记和度量来分析程序执行的时长。时间源(timeOrigin):是从Node.js进程启动到performance.now()的时间点,提供相对时间戳,精度达到毫秒级别。标记(marks):是性能时间轴上的标签,用于度量事件发生时的时间。度量(measures):用于计算不同标记之间的时间差。3.性能测量API3.1performance.now()performance.now()返回从Node.js进程启动到当前调用时间的毫秒数(相对时间戳),其精度达到小数点后三位(微秒级别)。conststartTime=performance.now();//执行一些代码constendTime=performance.now();console.log(`操作耗时${endTime-startTime}毫秒`);3.2performance.timeOriginperformance.timeOrigin返回Node.js进程启动时的UNIX时间戳。可以用于与performance.now()结合计算绝对时间。console.log(performance.timeOrigin);//输出:进程启动时的UNIX时间戳3.3performance.mark()performance.mark()用于在性能时间线上创建一个标记。可以使用多个标记来度量代码执行的时长。performance.mark('start');//执行一些代码performance.mark('end');3.4performance.measure()performance.measure()用于计算两个标记之间的时间,并创建一个PerformanceEntry对象。你需要传入度量名称以及开始和结束标记名称。performance.mark('start');//执行一些代码performance.mark('end');performance.measure('测量从start到end的时间','start','end');这个方法会生成一个新的PerformanceEntry,并存储度量的结果。3.5performance.clearMarks()performance.clearMarks()清除一个或多个标记。如果未提供参数,则清除所有标记。performance.clearMarks('start');performance.clearMarks();//清除所有标记3.6performance.clearMeasures()performance.clearMeasures()清除一个或多个测量。如果未提供参数,则清除所有测量。performance.clearMeasures('测量名称');performance.clearMeasures();//清除所有测量4.性能观察者API性能观察者(PerformanceObserver)允许你监控并响应性能条目的生成事件。使用PerformanceObserver,你可以监听如mark、measure等性能条目的创建,并在条目创建时执行自定义代码。4.1PerformanceObserverPerformanceObserver是一个监听性能条目生成的观察者。通过该观察者,你可以处理特定类型的性能条目。创建一个PerformanceObserverconstobserver=newPerformanceObserver((items)=>{items.getEntries().forEach((entry)=>{console.log(`名称:${entry.name},类型:${entry.entryType},开始时间:${entry.startTime},持续时间:${entry.duration}`);});});observer.observe({entryTypes:['measure']});上面的代码会监听所有measure类型的性能条目,并在它们生成时输出相应信息。observe()方法observe()方法用于指定要监听的性能条目类型。可以监听多种类型的条目,例如mark、measure、gc(垃圾回收)等。observer.observe({entryTypes:['mark','measure']});disconnect()方法disconnect()用于停止性能观察者的监听。observer.disconnect();5.性能条目类型性能条目对象提供关于性能事件的信息。以下是常见的性能条目类型。5.1PerformanceEntryPerformanceEntry对象包含性能事件的详细信息,包括:name:条目名称entryType:条目的类型,如mark或measurestartTime:条目开始时间(以毫秒为单位)duration:条目的持续时间(仅适用于measure)示例:constobserver=newPerformanceObserver((list)=>{constentries=list.getEntries();entries.forEach((entry)=>{console.log(entry.name,entry.startTime,entry.duration);});});observer.observe({entryTypes:['mark','measure']});6.使用示例示例1:测量代码块的执行时间const{performance}=require('perf_hooks');performance.mark('start');//执行一些操作for(leti=0;i<1000000;i++){}performance.mark('end');performance.measure('for循环执行时间','start','end');constentries=performance.getEntriesByType('measure');entries.forEach((entry)=>{console.log(`${entry.name}:${entry.duration}ms`);});示例2:监听性能条目const{performance,PerformanceObserver}=require('perf_hooks');constobs=newPerformanceObserver((list)=>{constentries=list.getEntries();entries.forEach((entry)=>{console.log(`条目:${entry.name},开始时间:${entry.startTime},持续时间:${entry.duration}`);});});obs.observe({entryTypes:['measure']});performance.mark('startTask');//执行任务for(leti=0;i<1000000;i++){}performance.mark('endTask');performance.measure('任务执行时间','startTask','endTask');7.总结Node.js的PerformanceHooks模块为开发者提供了强大的性能监测工具,可以帮助追踪代码中的性能瓶颈和执行时长。通过标记和测量,开发者可以轻松记录关键代码的性能数据,并使用PerformanceObserver监听和处理这些性能事件。

nodejs 4 1天前
NodeJs-OS
小卒子

NodeJs-OS

Node.js的os模块提供了与操作系统相关的实用功能,允许开发者获取操作系统信息以及与系统交互。通过os模块,开发者可以轻松获取平台类型、CPU架构、内存信息、网络接口等系统信息。本文将详细介绍os模块的所有属性、方法以及使用方式,涵盖它的所有相关功能。1.模块引入os是Node.js的内置模块,无需安装第三方库。只需通过require('os')即可使用。constos=require('os');2.操作系统信息2.1os.arch()该方法返回操作系统的CPU架构,通常是x64、arm、arm64、ia32等。console.log(os.arch());//输出:x642.2os.platform()返回操作系统的平台名称。常见的返回值包括:linux、win32、darwin(macOS)。console.log(os.platform());//输出:win32(在Windows上)2.3os.type()返回操作系统的类型,如Linux、Windows_NT或Darwin。console.log(os.type());//输出:Windows_NT2.4os.release()返回操作系统的版本号。console.log(os.release());//输出:10.0.19042(在Windows10上)2.5os.version()返回Node.js编译时操作系统的版本号,通常比os.release()提供的版本更详细。console.log(os.version());//输出:#59-UbuntuSMPWedOct2819:55:39UTC2020(在Linux上)2.6os.uptime()返回操作系统的运行时间(以秒为单位)。console.log(os.uptime());//输出:1234567(秒数)2.7os.hostname()返回操作系统的主机名。console.log(os.hostname());//输出:MyComputer3.内存信息3.1os.totalmem()返回系统总内存量,以字节为单位。console.log(os.totalmem());//输出:8589934592(即8GB)3.2os.freemem()返回系统空闲内存量,以字节为单位。console.log(os.freemem());//输出:2147483648(即2GB)4.CPU信息4.1os.cpus()返回关于每个逻辑CPU内核的信息,包括模型、速度(MHz)和每个CPU内核的时间(用户、空闲等)。console.log(os.cpus());/*[{model:'Intel(R)Core(TM)i7-7700HQCPU@2.80GHz',speed:2808,times:{user:123456789,nice:0,sys:12345678,idle:123456789,irq:0}},//...]*/4.2os.loadavg()返回一个包含三个元素的数组,分别表示1、5和15分钟的平均负载。仅在Unix系统上有效,Windows上此方法返回[0,0,0]。console.log(os.loadavg());//输出:[0.25,0.4,0.5]5.网络接口信息5.1os.networkInterfaces()返回一个包含已分配网络接口的对象。对象的键是网络接口的名称,值是包含有关地址、掩码、族别和MAC地址的信息。console.log(os.networkInterfaces());/*{lo:[{address:'127.0.0.1',netmask:'255.0.0.0',family:'IPv4',mac:'00:00:00:00:00:00',internal:true},{address:'::1',netmask:'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',family:'IPv6',mac:'00:00:00:00:00:00',internal:true}],eth0:[{address:'192.168.0.100',netmask:'255.255.255.0',family:'IPv4',mac:'01:23:45:67:89:ab',internal:false}]}*/6.其他方法6.1os.homedir()返回当前用户的主目录路径。console.log(os.homedir());//输出:C:\Users\MyUsername(在Windows上)6.2os.tmpdir()返回操作系统的临时文件目录路径。console.log(os.tmpdir());//输出:C:\Users\MyUsername\AppData\Local\Temp(在Windows上)6.3os.endianness()返回操作系统的字节序列("BE"或"LE"),分别表示大端序和小端序。console.log(os.endianness());//输出:LE(在大多数现代系统上)6.4os.userInfo()返回包含当前用户信息的对象。包含用户名、主目录路径、shell等信息。console.log(os.userInfo());/*{uid:-1,gid:-1,username:'MyUsername',homedir:'C:\\Users\\MyUsername',shell:null//在Windows系统上}*/7.实验性APIos.constants:提供了一组操作系统错误代码和信号的常量。该属性仍是实验性API,可能会在将来的Node.js版本中更改。console.log(os.constants);/*{UV_UDP_REUSEADDR:4,signals:{SIGHUP:1,SIGINT:2,SIGILL:4,SIGABRT:6,SIGFPE:8,SIGKILL:9,SIGSEGV:11,SIGPIPE:13,SIGALRM:14,SIGTERM:15,...},errno:{E2BIG:7,EACCES:13,EADDRINUSE:98,...}}*/8.示例代码获取系统基本信息constos=require('os');console.log('平台:',os.platform());console.log('架构:',os.arch());console.log('系统类型:',os.type());console.log('版本:',os.release());console.log('主机名:',os.hostname());console.log('总内存:',os.totalmem());console.log('可用内存:',os.freemem());console.log('CPU信息:',os.cpus());console.log('网络接口:',os.networkInterfaces());console.log('用户信息:',os.userInfo());获取系统运行时间和负载信息constos=require('os');console.log('系统运行时间(秒):',os.uptime());console.log('系统平均负载:',os.loadavg());9.总结Node.js的os模块为开发者提供了获取操作系统信息和系统交互的能力。无论是在进行性能监控、调试,还是需要根据系统条件作出不同的处理,os模块都非常有用。通过本文的详细介绍,开发者可以灵活使用os模块的各种方法来获取和操作系统相关的信息。

nodejs 4 1天前
NodeJs-Net
小卒子

NodeJs-Net

Node.js的net模块用于创建低层次的TCP或IPC服务器和客户端,它为Node.js应用提供了与操作系统网络相关的功能,可以用来处理原始套接字通信。本文将详细介绍net模块的所有属性、方法以及使用方式,并涵盖它的相关功能。1.模块引入net模块是Node.js的内置模块,因此无需安装任何额外的库,只需通过require('net')来引入即可。constnet=require('net');2.TCP服务器2.1net.createServer()net.createServer()用于创建一个TCP服务器对象。它接收一个回调函数,当新的连接到达时,该回调函数将被调用,并传递一个socket对象,代表与客户端之间的连接。constserver=net.createServer((socket)=>{console.log('客户端连接');//处理来自客户端的数据socket.on('data',(data)=>{console.log(`客户端发送的数据:${data}`);});//处理客户端断开连接socket.on('end',()=>{console.log('客户端断开连接');});//向客户端发送数据socket.write('欢迎连接到服务器!\n');});2.2server.listen()server.listen()启动服务器监听指定的端口和主机名。可以使用server.listen()来启动服务器,并开始接受连接。server.listen(8080,'127.0.0.1',()=>{console.log('服务器已启动,正在监听127.0.0.1:8080');});也可以仅传递端口号,默认监听所有可用的网络接口。server.listen(8080,()=>{console.log('服务器正在监听端口8080');});2.3server.close()server.close()关闭服务器,停止接受新连接,并等待现有连接结束。server.close(()=>{console.log('服务器已关闭');});2.4事件:connection,close,errorconnection:每当有新客户端连接时触发。close:当服务器关闭时触发。error:当发生错误时触发。server.on('connection',(socket)=>{console.log('新连接到达');});server.on('error',(err)=>{console.error('服务器发生错误:',err);});3.TCP客户端3.1net.connect()net.connect()(或net.createConnection())用于创建TCP客户端,并连接到指定的服务器。constclient=net.connect({port:8080,host:'127.0.0.1'},()=>{console.log('已连接到服务器');client.write('你好,服务器!');});3.2client.write()client.write()用于向服务器发送数据。可以通过该方法发送字符串或缓冲区数据。client.write('发送一些数据到服务器');3.3client.end()client.end()用于关闭与服务器的连接。可以在发送最后一条消息后调用end(),告诉服务器不再发送任何数据。client.end('再见,服务器');3.4事件:data,end,errordata:每当接收到服务器的数据时触发。end:当服务器关闭连接时触发。error:当连接发生错误时触发。client.on('data',(data)=>{console.log(`接收到服务器数据:${data}`);});client.on('end',()=>{console.log('已断开与服务器的连接');});client.on('error',(err)=>{console.error('发生错误:',err);});4.套接字对象net.Socket对象表示与远程主机的TCP连接,既可用于客户端,也可用于服务器端的连接。4.1socket.write()socket.write()用于通过套接字发送数据。可以发送字符串或缓冲区数据。socket.write('发送数据到客户端或服务器');4.2socket.end()socket.end()用于关闭套接字。可以在发送完所有数据后调用此方法。socket.end('关闭连接并发送最后一条消息');4.3socket.setTimeout()socket.setTimeout()用于设置超时时间(以毫秒为单位)。如果在超时期间没有活动,套接字将触发timeout事件。socket.setTimeout(5000);//5秒后触发timeoutsocket.on('timeout',()=>{console.log('连接超时');socket.end();});4.4事件:data,end,timeoutdata:每当接收到数据时触发。end:当连接结束时触发。timeout:当连接超时时触发。socket.on('data',(data)=>{console.log(`收到的数据:${data}`);});socket.on('end',()=>{console.log('连接已关闭');});socket.on('timeout',()=>{console.log('连接超时');});5.IPC通信Node.js的net模块支持IPC(Inter-ProcessCommunication,进程间通信),可以通过UNIX套接字或Windows命名管道进行进程间通信。5.1net.createServer()和net.connect()用于IPC创建IPC服务器时,使用文件路径(UNIX)或命名管道(Windows)作为地址。//服务器端constserver=net.createServer((socket)=>{console.log('IPC客户端连接');socket.write('欢迎到IPC服务器');});server.listen('/tmp/echo.sock');//在UNIX系统中客户端连接到相同的路径://客户端constclient=net.connect('/tmp/echo.sock',()=>{console.log('已连接到IPC服务器');client.write('你好,IPC服务器');});6.错误处理和最佳实践在使用net模块时,错误处理至关重要。确保在服务器和客户端中都添加对error事件的处理程序,防止未处理的异常导致应用崩溃。server.on('error',(err)=>{console.error('服务器发生错误:',err);});client.on('error',(err)=>{console.error('客户端发生错误:',err);});连接恢复机制对于客户端而言,连接到服务器失败时,可以实现重试逻辑。functionconnectToServer(){constclient=net.connect({port:8080},()=>{console.log('已连接到服务器');});client.on('error',(err)=>{console.error('连接失败,重试中...',err);setTimeout(connectToServer,5000);//5秒后重试});}connectToServer();7.示例代码TCP服务器和客户端服务器端constnet=require('net');constserver=net.createServer((socket)=>{console.log('新客户端连接');socket.on('data',(data)=>{console.log(`客户端发送的数据:${data}`);socket.write('已收到');});socket.on('end',()=>{console.log('客户端断开连接');});socket.write('欢迎连接到服务器!\n');});server.listen(8080,()=>{console.log('服务器正在监听端口8080');});客户端constnet=require('net');constclient=net.connect({port:8080},()=>{console.log('已连接到服务器');client.write('你好,服务器!');});client.on('data',(data)=>{console.log(`接收到的数据:${data}`);client.end();});client.on('end',()=>{console.log('已断开与服务器的连接');});8.总结net模块是Node.js中用于处理TCP或IPC连接的强大工具。它提供了服务器和客户端之间的低层网络通信能力,适合处理实时数据传输、聊天室应用、流式数据传输等任务。通过结合事件驱动机制和套接字对象,开发者可以轻松构建高效的网络应用。

nodejs 4 1天前
NodeJs-Modules CommonJS modules、ECMAScript modules、node:module、Packages、TypeScript
小卒子

NodeJs-Modules CommonJS modules、ECMAScript modules、node:module、Packages、TypeScript

Node.js的模块系统为开发者提供了强大的工具,用于组织代码、管理依赖,并支持不同的模块标准。这包括CommonJS模块、ECMAScript模块(ESM)、node:module模块、Packages和TypeScript集成。本文将详细介绍这些模块系统的属性、方法、使用方法及相关内容。1.CommonJS模块1.1模块导入与导出CommonJS是Node.js默认的模块系统。每个文件都是一个模块,可以导出函数、对象或原始值。模块通过module.exports导出,并通过require()导入。导出//myModule.jsconstmyFunction=()=>{console.log('HellofrommyFunction');};module.exports=myFunction;导入//app.jsconstmyFunction=require('./myModule');myFunction();//输出:"HellofrommyFunction"1.2require函数require()是CommonJS中用于加载模块的函数。它会同步读取并执行指定的模块文件,并返回module.exports的内容。使用constfs=require('fs');//导入核心模块constmyModule=require('./myModule');//导入自定义模块缓存机制模块只会在首次加载时执行一次,之后的加载会直接从缓存中返回结果。这可以避免重复执行相同模块。//第一次加载constmodule1=require('./myModule');//再次加载,直接从缓存中返回constmodule2=require('./myModule');console.log(module1===module2);//输出:true1.3module对象每个模块都拥有一个module对象,代表当前模块。module.exports:模块的导出对象,其他模块通过require导入的内容即为module.exports的值。示例//myModule.jsconsole.log(module);//输出当前模块的信息1.4exports对象exports是module.exports的快捷方式,两者指向同一个对象。可以使用exports导出多个属性。示例//myModule.jsexports.hello=()=>{console.log('Hello');};exports.goodbye=()=>{console.log('Goodbye');};2.ECMAScript模块(ESM)Node.js也支持ECMAScript模块(ESM),这是一种现代的模块系统,最初在浏览器中引入,并在ECMAScript规范中标准化。ESM的特性包括静态解析、异步加载等。2.1import语句import语句用于从其他模块中导入绑定。导入默认导出importmyFunctionfrom'./myModule.js';myFunction();导入命名导出import{myFunction,myVariable}from'./myModule.js';动态导入ESM允许动态导入模块,返回一个Promise,可用于按需加载模块。constmodule=awaitimport('./myModule.js');module.myFunction();2.2export语句export语句用于从模块中导出绑定,可以是函数、变量、类等。导出默认值exportdefaultfunction(){console.log('Hellofromdefaultexport');}导出多个值exportconstmyVariable=42;exportfunctionmyFunction(){console.log('HellofrommyFunction');}2.3package.json配置为了使用ESM,package.json文件中需要设置"type":"module"。这会将.js文件视为ESM模块。{"type":"module"}3.node:module模块node:module模块提供了与Node.js模块系统交互的功能,例如动态加载模块、创建自定义的require函数等。3.1require()与import()require()用于CommonJS模块,而import()用于ESM。两者之间不能混用,但import()可以用于动态导入CommonJS模块。3.2createRequire()createRequire()创建一个新的require函数,用于在ESM中导入CommonJS模块。示例import{createRequire}from'node:module';constrequire=createRequire(import.meta.url);constfs=require('fs');3.3createRequireFromPath()createRequireFromPath()已被废弃。推荐使用createRequire()代替。4.PackagesNode.js的包管理系统允许使用npm发布、安装和管理包。package.json是包的配置文件,包含了包的元数据和依赖信息。4.1package.json中的模块类型package.json中的"type"字段决定了文件的模块类型:"type":"commonjs":将.js文件视为CommonJS模块。"type":"module":将.js文件视为ESM模块。4.2包的解析和加载Node.js根据require()或import语句解析和加载模块。加载顺序如下:核心模块(如fs、http等)本地模块(绝对路径或相对路径)node_modules目录中的包4.3exports字段exports字段用于定义包的入口点,支持定义不同的导出路径和模块类型。示例{"exports":{".":"./main.js","./feature":"./feature.js"}}5.TypeScript和Node.jsTypeScript提供了静态类型检查和现代JavaScript特性,并与Node.js无缝集成。5.1TypeScript配置通过tsconfig.json文件配置TypeScript编译选项。{"compilerOptions":{"module":"commonjs","target":"es6","outDir":"./dist"}}5.2TypeScript中的模块TypeScript支持CommonJS和ESM模块系统,可以根据需要选择配置。示例//使用CommonJS模块importfs=require('fs');//使用ESM模块import{readFile}from'fs/promises';5.3TypeScript和ESM要在TypeScript中使用ESM,必须在tsconfig.json中设置module为ESNext或ES6。{"compilerOptions":{"module":"ESNext","target":"ES6"}}6.示例代码CommonJS示例//myModule.jsexports.hello=()=>{console.log('Hello');};//app.jsconstmyModule=require('./myModule');myModule.hello();ESM示例//myModule.jsexportfunctionhello(){console.log('Hello');}//app.jsimport{hello}from'./myModule.js';hello();TypeScript示例//myModule.tsexportconstgreet=(name:string):string=>{return`Hello,${name}`;};//app.tsimport{greet}from'./myModule';console.log(greet('World'));7.总结Node.js提供了多种模块系统,支持CommonJS、ECMAScript模块、TypeScript等。开发者可以根据项目需求选择适合的模块系统,并通过配置package.json文件和TypeScript配置文件,优化项目的模块管理和构建流程。随着ESM的普及,未来的Node.js项目将更趋向于使用ESM进行模块管理。

nodejs 16 3天前
NodeJs-Internationalization
小卒子

NodeJs-Internationalization

Node.js的国际化(Internationalization,简称i18n)模块允许应用程序在多语言环境中正确处理文本、日期、时间和货币格式。Node.js提供了Intl对象,这是ECMAScript国际化API的一部分,主要通过各种构造函数和方法提供国际化支持。以下是关于Node.js国际化(Intl)的详细介绍,包括它的属性、方法以及使用示例。1.Intl对象Intl是JavaScript的全局对象之一,提供了多种构造函数和方法来支持不同的国际化需求,如格式化日期、时间、数字和货币,以及处理字符串的比较。1.1Intl构造函数Intl.Collator:用于比较字符串。Intl.DateTimeFormat:用于格式化日期和时间。Intl.NumberFormat:用于格式化数字(包括货币和百分比)。Intl.PluralRules:用于确定复数规则。Intl.RelativeTimeFormat:用于格式化相对时间。Intl.ListFormat:用于格式化列表。Intl.DisplayNames:用于显示各种语言、区域、脚本和货币名称。1.2Intl方法Intl.getCanonicalLocales(locales):返回语言环境的规范化名称数组。constcanonicalLocales=Intl.getCanonicalLocales('EN-us');console.log(canonicalLocales);//["en-US"]2.Intl.CollatorIntl.Collator用于字符串比较,例如在不同语言环境下对字符串进行排序。2.1构造函数newIntl.Collator([locales[,options]]):创建一个新的字符串比较对象。locales:可选,表示一个或多个语言环境的字符串或数组。options:可选,包含影响比较行为的配置。usage:sort或search,默认值为sort。sensitivity:base,accent,case或variant。ignorePunctuation:是否忽略标点符号。2.2方法collator.compare(string1,string2):比较两个字符串,返回一个数字,指示字符串的排序顺序。constcollator=newIntl.Collator('en',{sensitivity:'base'});console.log(collator.compare('a','A'));//0,表示相等collator.resolvedOptions():返回一个对象,表示实例的配置选项。console.log(collator.resolvedOptions());//{locale:"en",usage:"sort",sensitivity:"base",ignorePunctuation:false,...}3.Intl.DateTimeFormatIntl.DateTimeFormat用于格式化日期和时间,根据语言环境以不同格式展示日期和时间信息。3.1构造函数newIntl.DateTimeFormat([locales[,options]]):创建一个日期时间格式化对象。locales:可选,表示一个或多个语言环境的字符串或数组。options:可选,包含影响日期和时间格式的配置。weekday,era,year,month,day,hour,minute,second:用于指定时间的各个部分应该如何显示。timeZone:用于指定时区(如'UTC')。3.2方法dateTimeFormat.format(date):格式化指定的日期对象。constdateFormat=newIntl.DateTimeFormat('en-US',{year:'numeric',month:'long',day:'numeric'});console.log(dateFormat.format(newDate()));//September4,2024dateTimeFormat.formatToParts(date):将日期对象格式化为不同部分的数组。console.log(dateFormat.formatToParts(newDate()));//[{type:"month",value:"September"},{type:"literal",value:""},...]dateTimeFormat.resolvedOptions():返回一个对象,表示实例的配置选项。console.log(dateFormat.resolvedOptions());//{locale:"en-US",calendar:"gregory",numberingSystem:"latn",...}4.Intl.NumberFormatIntl.NumberFormat用于根据语言环境格式化数字,支持货币、百分比等格式。4.1构造函数newIntl.NumberFormat([locales[,options]]):创建一个数字格式化对象。locales:可选,表示一个或多个语言环境的字符串或数组。options:可选,包含影响数字格式的配置。style:decimal,currency,percent,指定格式类型。currency:指定货币代码(如'USD')。minimumFractionDigits,maximumFractionDigits:小数位数。4.2方法numberFormat.format(number):格式化数字。constcurrencyFormat=newIntl.NumberFormat('en-US',{style:'currency',currency:'USD'});console.log(currencyFormat.format(1234.56));//$1,234.56numberFormat.formatToParts(number):将数字格式化为不同部分的数组。console.log(currencyFormat.formatToParts(1234.56));//[{type:"currency",value:"$"},{type:"integer",value:"1"},...]numberFormat.resolvedOptions():返回一个对象,表示实例的配置选项。console.log(currencyFormat.resolvedOptions());//{locale:"en-US",numberingSystem:"latn",style:"currency",currency:"USD",...}5.Intl.PluralRulesIntl.PluralRules用于根据语言环境的复数规则,确定数值的复数形式。5.1构造函数newIntl.PluralRules([locales[,options]]):创建一个复数规则对象。locales:可选,表示一个或多个语言环境的字符串或数组。options:可选,影响复数规则的配置。type:cardinal或ordinal,表示基数或序数。5.2方法pluralRules.select(number):返回给定数字的复数形式。constpluralRules=newIntl.PluralRules('en-US');console.log(pluralRules.select(1));//"one"console.log(pluralRules.select(2));//"other"pluralRules.resolvedOptions():返回一个对象,表示实例的配置选项。console.log(pluralRules.resolvedOptions());//{locale:"en-US",type:"cardinal",minimumIntegerDigits:1,...}6.Intl.RelativeTimeFormatIntl.RelativeTimeFormat用于格式化相对时间,如“2天前”或“明天”。6.1构造函数newIntl.RelativeTimeFormat([locales[,options]]):创建一个相对时间格式化对象。locales:可选,表示一个或多个语言环境的字符串或数组。options:可选,包含影响相对时间格式的配置。numeric:always或auto,指示是否总是使用数字。style:long,short,narrow。6.2方法relativeTimeFormat.format(value,unit):格式化相对时间。constrtf=newIntl.RelativeTimeFormat('en',{numeric:'auto'});console.log(rtf.format(-1,'day'));//"yesterday"console.log(rtf.format(1,'day'));//"tomorrow"relativeTimeFormat.formatToParts(value,unit):将相对时间格式化为不同部分的数组。console.log(rtf.formatToParts(-1,'day'));//[{type:"literal",value:"yesterday"}]relativeTimeFormat.resolvedOptions():返回一个对象,表示实例的配置选项。console.log(rtf.resolvedOptions());//{locale:"en",style:"long",numeric:"auto",...}7.Intl.ListFormatIntl.ListFormat用于格式化项目列表,例如将数组转换为“苹果、香蕉和橙子”这样的字符串。7.1构造函数newIntl.ListFormat([locales[,options]]):创建一个列表格式化对象。locales:可选,表示一个或多个语言环境的字符串或数组。options:可选,影响列表格式的配置。type:conjunction(和),disjunction(或),unit(单位)。style:long,short,narrow。7.2方法listFormat.format(list):格式化列表。constlistFormat=newIntl.ListFormat('en',{style:'short',type:'conjunction'});console.log(listFormat.format(['Apple','Banana','Orange']));//"Apple,Banana,andOrange"listFormat.formatToParts(list):将列表格式化为不同部分的数组。console.log(listFormat.formatToParts(['Apple','Banana','Orange']));//[{type:"element",value:"Apple"},{type:"literal",value:","},...]listFormat.resolvedOptions():返回一个对象,表示实例的配置选项。console.log(listFormat.resolvedOptions());//{locale:"en",style:"short",type:"conjunction",...}8.Intl.DisplayNamesIntl.DisplayNames用于显示语言、区域、脚本和货币的名称。8.1构造函数newIntl.DisplayNames(locales,options):创建一个显示名称对象。locales:一个或多个语言环境的字符串或数组。options:配置显示名称的选项。type:language,region,script,currency。style:long,short,narrow。fallback:code,none。8.2方法displayNames.of(code):获取给定代码的显示名称。constdisplayNames=newIntl.DisplayNames(['en'],{type:'currency'});console.log(displayNames.of('USD'));//"USDollar"displayNames.resolvedOptions():返回一个对象,表示实例的配置选项。console.log(displayNames.resolvedOptions());//{locale:"en",style:"long",type:"currency",...}9.总结Node.js的国际化支持通过Intl对象及其构造函数和方法提供了强大的工具,帮助开发者在全球化应用中处理不同语言环境下的日期、时间、数字、货币和文本格式。利用这些工具,开发者可以确保应用程序在多语言环境中的一致性和正确性,从而更好地服务于全球用户。

nodejs 14 3天前
NodeJs-Inspector
小卒子

NodeJs-Inspector

Node.js的inspector模块提供了一种程序化的方式来与V8Inspector协议通信,该协议支持通过ChromeDevTools或其他兼容工具来调试和分析Node.js应用程序。通过inspector模块,开发者可以启动和控制调试会话、设置断点、监控执行状态等。以下是inspector模块的详细介绍,包括它的属性、方法以及如何使用它们。1.引入inspector模块首先,需要在你的Node.js应用程序中引入inspector模块:constinspector=require('inspector');2.启动和控制调试会话2.1inspector.SessionSession类用于表示一个与V8Inspector协议交互的会话。常用方法session.connect()功能:连接到V8Inspector。使用:在启动调试或分析任务之前调用。constsession=newinspector.Session();session.connect();session.disconnect()功能:断开与V8Inspector的连接。使用:调试或分析任务完成后调用。session.disconnect();session.post(method[,params][,callback])功能:发送一个Inspector协议的命令。参数:method:要调用的V8Inspector方法(例如'Debugger.enable')。params:方法的参数(可选)。callback:命令完成时的回调(可选),回调参数是error和result。session.post('Runtime.enable',(err)=>{if(!err){console.log('Runtimeenabled');}});session.on(event,listener)功能:监听V8Inspector事件。参数:event:要监听的事件名称。listener:事件发生时调用的回调函数。session.on('Debugger.paused',(message)=>{console.log('Executionpaused:',message);});2.2启动一个调试会话以下是一个基本的例子,展示了如何启动一个调试会话并设置断点:constsession=newinspector.Session();session.connect();session.post('Debugger.enable',()=>{session.post('Debugger.setBreakpointByUrl',{lineNumber:5,//设定断点的行号url:'file://'+__filename},(err,{breakpointId})=>{console.log('Breakpointset:',breakpointId);});});3.内置的Debugger事件和方法3.1Debugger.enable功能:启用调试器。使用:在需要调试功能时,首先调用该方法。session.post('Debugger.enable',(err)=>{if(!err){console.log('Debuggerenabled');}});3.2Debugger.disable功能:禁用调试器。使用:在调试完成后,调用该方法禁用调试器。session.post('Debugger.disable',(err)=>{if(!err){console.log('Debuggerdisabled');}});3.3Debugger.setBreakpointByUrl功能:通过URL和行号设置断点。参数:lineNumber:要设置断点的行号。url:代码所在的文件URL。session.post('Debugger.setBreakpointByUrl',{lineNumber:10,url:'file://'+__filename},(err,{breakpointId,locations})=>{console.log('Breakpointsetat:',locations);});3.4Debugger.resume功能:恢复代码的执行(在代码暂停时使用)。使用:当调试器暂停代码执行时,可以调用该方法继续执行。session.post('Debugger.resume',(err)=>{if(!err){console.log('Executionresumed');}});3.5Debugger.pause功能:暂停代码的执行。使用:在调试过程中,可以随时暂停代码执行。session.post('Debugger.pause',(err)=>{if(!err){console.log('Executionpaused');}});3.6Debugger.stepOver功能:在调试时,单步执行(步过函数调用)。使用:当代码暂停后,用于逐步执行代码。session.post('Debugger.stepOver',(err)=>{if(!err){console.log('Steppedover');}});4.HeapProfiler事件和方法4.1HeapProfiler.enable功能:启用堆内存分析器。使用:在进行堆内存分析前调用。session.post('HeapProfiler.enable',(err)=>{if(!err){console.log('HeapProfilerenabled');}});4.2HeapProfiler.takeHeapSnapshot功能:生成堆内存快照。使用:用于分析当前的内存使用情况。session.post('HeapProfiler.takeHeapSnapshot',(err)=>{if(!err){console.log('Heapsnapshottaken');}});4.3HeapProfiler.startTrackingHeapObjects功能:开始跟踪堆内存中的对象分配。使用:在需要监控内存泄漏或分析内存分配时使用。session.post('HeapProfiler.startTrackingHeapObjects',(err)=>{if(!err){console.log('Startedtrackingheapobjects');}});4.4HeapProfiler.stopTrackingHeapObjects功能:停止跟踪堆内存中的对象分配。使用:在完成内存分析后调用。session.post('HeapProfiler.stopTrackingHeapObjects',(err)=>{if(!err){console.log('Stoppedtrackingheapobjects');}});5.CPUProfiler事件和方法5.1Profiler.enable功能:启用CPU分析器。使用:在进行CPU分析前调用。session.post('Profiler.enable',(err)=>{if(!err){console.log('CPUProfilerenabled');}});5.2Profiler.start功能:开始CPU性能分析。使用:用于记录代码执行时的CPU使用情况。session.post('Profiler.start',(err)=>{if(!err){console.log('CPUprofilingstarted');}});5.3Profiler.stop功能:停止CPU性能分析,并返回分析结果。使用:当完成CPU分析时,调用该方法。session.post('Profiler.stop',(err,{profile})=>{if(!err){console.log('CPUprofilingstopped');console.log(profile);//profile包含了CPU分析的结果}});5.4Profiler.takePreciseCoverage功能:获取精确的代码覆盖率数据。使用:用于详细分析哪些代码行被执行。session.post('Profiler.takePreciseCoverage',(err,{result})=>{if(!err){console.log('Precisecoveragetaken:',result);}});6.Node.js特定的V8Inspector扩展Node.js还添加了一些特定于Node.js的扩展到V8Inspector协议中,以支持Node.js的特定调试和分析需求。6.1NodeRuntime.getProcessInfo功能:获取有关当前Node.js进程的信息。使用:获取进程ID、启动时间、命令行参数等信息。session.post('NodeRuntime.getProcessInfo',(err,{processInfo})=>{if(!err){console.log('ProcessInfo:',processInfo);}});6.2NodeRuntime.restart功能:重新启动当前Node.js进程。使用:调试过程中,可以调用该方法来重新启动应用。session.post('NodeRuntime.restart',(err)=>{if(!err){console.log('Processrestarted');}});6.3NodeHeapDump.writeHeapSnapshot功能:生成并写入堆内存快照到文件中。使用:用于在特定时刻生成堆快照,以供后续分析。session.post('NodeHeapDump.writeHeapSnapshot',(err,{dumpPath})=>{if(!err){console.log('Heapsnapshotwrittento',dumpPath);}});7.监听WebSocket连接的调试器Node.js可以通过WebSocket连接来远程调试和分析应用。通过启动Node.js进程并指定--inspect或--inspect-brk参数,可以启用WebSocket调试。node--inspect=localhost:9229yourScript.js之后,可以通过WebSocket连接到调试端点,或者使用ChromeDevTools进行远程调试。8.总结inspector模块为Node.js提供了强大的调试和分析能力。通过使用inspector.Session类和相应的V8Inspector方法,开发者可以在代码运行时对其进行深入的调试、性能分析、内存分析等操作。这对于开发和维护复杂的Node.js应用程序尤为重要。

nodejs 16 3天前
Node.js-HTTPS
小卒子

Node.js-HTTPS

Node.js提供的https模块用于在Node.js中创建HTTPS服务器和客户端。HTTPS(HypertextTransferProtocolSecure)是HTTP的安全版本,使用SSL/TLS(安全套接字层/传输层安全)加密传输数据,确保通信的安全性和完整性。以下是Node.jshttps模块的详细介绍,包括它的属性和方法,以及如何使用它们。1.引入https模块在使用https模块之前,首先需要在你的Node.js应用程序中引入它:consthttps=require('https');2.创建HTTPS服务器2.1https.createServer(options[,requestListener])功能:创建一个HTTPS服务器,所有传入的连接都将使用SSL/TLS加密。参数:options:配置对象,必须包含SSL/TLS证书和私钥。requestListener:可选的回调函数,用于处理传入的HTTP请求。constfs=require('fs');constoptions={key:fs.readFileSync('server-key.pem'),cert:fs.readFileSync('server-cert.pem')};constserver=https.createServer(options,(req,res)=>{res.writeHead(200,{'Content-Type':'text/plain'});res.end('Hello,HTTPS!');});server.listen(8443,()=>{console.log('HTTPSserverrunningathttps://localhost:8443');});详细的options配置参数key:私钥,用于SSL/TLS,通常是.pem或.key文件。cert:证书,用于SSL/TLS,通常是.pem或.crt文件。ca:证书颁发机构链(CertificateAuthoritychain),用于客户端认证。passphrase:用于解密私钥的密码。rejectUnauthorized:当为true时,如果未能验证客户端证书,则拒绝连接。2.2https.Server类https.Server类继承自tls.Server,因此它拥有所有tls.Server的属性和方法。常用属性和方法server.listen(port[,hostname][,backlog][,callback]):监听指定的端口,接受传入的连接。server.close([callback]):停止服务器接受新的连接,关闭现有连接。server.setTimeout([msecs][,callback]):设置服务器的超时时间。示例:使用https.Server对象的属性和方法server.setTimeout(5000,()=>{console.log('Requesthastimedout.');});server.on('clientError',(err,socket)=>{console.error('ClientError:',err);socket.end('HTTP/1.1400BadRequest\r\n\r\n');});3.HTTPS客户端3.1https.request(options[,callback])功能:发起一个HTTPS请求。参数:options:配置对象,可以是URL字符串或对象形式,包含请求的配置信息。callback:可选的回调函数,当响应到来时被调用。constoptions={hostname:'example.com',port:443,path:'/',method:'GET',key:fs.readFileSync('client-key.pem'),cert:fs.readFileSync('client-cert.pem'),ca:fs.readFileSync('ca-cert.pem')};constreq=https.request(options,(res)=>{console.log(`Status:${res.statusCode}`);res.on('data',(d)=>{process.stdout.write(d);});});req.on('error',(e)=>{console.error(`Problemwithrequest:${e.message}`);});req.end();详细的options配置参数hostname:请求的主机名或IP地址。port:服务器的端口号,默认值为443。method:请求的方法(如GET、POST)。path:请求的路径,默认值为'/'。headers:请求头对象。key:客户端SSL/TLS私钥。cert:客户端SSL/TLS证书。ca:证书颁发机构链。rejectUnauthorized:如果为true,则验证服务器证书;如果为false,则不验证服务器证书(不建议用于生产环境)。3.2https.get(options[,callback])功能:发起一个HTTPSGET请求。它是https.request()的简便方法,预设置了HTTP方法为GET。参数:options:请求配置对象或URL字符串。callback:可选的回调函数,当响应到来时调用。https.get('https://jsonplaceholder.typicode.com/todos/1',(res)=>{letdata='';res.on('data',(chunk)=>{data+=chunk;});res.on('end',()=>{console.log(JSON.parse(data));});}).on('error',(err)=>{console.error('Error:'+err.message);});4.HTTPS事件4.1server.on(event,listener)功能:监听HTTPS服务器上发生的特定事件。常用事件:'request':当收到HTTP请求时触发,回调参数为request和response对象。'secureConnection':当新的TLS连接被创建时触发。'clientError':当客户端连接出现错误时触发。server.on('request',(req,res)=>{console.log(`Requestreceived:${req.method}${req.url}`);});server.on('secureConnection',(tlsSocket)=>{console.log('Secureconnectionestablished.');});4.2req.on(event,listener)功能:监听HTTPS客户端请求对象上发生的特定事件。常用事件:'response':当服务器发送响应时触发。'error':当请求发生错误时触发。req.on('response',(res)=>{console.log(`Responsestatus:${res.statusCode}`);});req.on('error',(err)=>{console.error('Requesterror:',err);});4.3res.on(event,listener)功能:监听HTTPS客户端响应对象上发生的特定事件。常用事件:'data':当有数据块可用时触发。'end':当没有更多数据要接收时触发。'error':当响应发生错误时触发。res.on('data',(chunk)=>{console.log('Receivedchunk:',chunk.toString());});res.on('end',()=>{console.log('Nomoredata.');});5.HTTPS安全设置使用HTTPS时需要处理安全设置,例如:证书验证:使用有效的SSL/TLS证书,避免使用自签名证书或禁用证书验证。SSL/TLS版本控制:配置SSL/TLS版本和加密算法,禁用已知不安全的版本(如SSLv3)。证书颁发机构(CA):使用受信任的证书颁发机构(CA)签发的证书。6.HTTPS代理Node.js的https模块支持使用代理服务器。你可以通过设置请求的agent属性来使用代理服务器。https-proxy-agent包是一个常用的解决方案。使用代理的示例constHttpsProxyAgent=require('https-proxy-agent');constproxyAgent=newHttpsProxyAgent('http://your-proxy-server.com:8080');constoptions={hostname:'example.com',port:443,path:'/',method:'GET',agent:proxyAgent};constreq=https.request(options,(res)=>{console.log(`Status:${res.statusCode}`);res.on('data',(chunk)=>{process.stdout.write(chunk);});});req.on('error',(e)=>{console.error(`Problemwithrequest:${e.message}`);});req.end();7.总结Node.js的https模块提供了创建安全、加密的服务器和客户端的功能。通过理解和使用其属性和方法,可以确保应用程序的通信安全性和完整性。在实现中,应该特别注意SSL/TLS配置、证书验证和安全事件的处理。

nodejs 25 4天前
NodeJs-HTTP/2
小卒子

NodeJs-HTTP/2

Node.js的http2模块支持HTTP/2协议,HTTP/2是HTTP协议的升级版本,旨在提高Web性能,通过多路复用、头部压缩和服务器推送等功能优化数据传输。http2模块在Node.jsv8.4.0及更高版本中可用,默认处于实验性阶段,但在更高版本中已经稳定。下面是Node.jshttp2模块的相关属性及方法的详细介绍。1.引入http2模块首先,需要引入http2模块:consthttp2=require('http2');2.HTTP/2服务器2.1http2.createServer([options][,onRequest])功能:创建一个支持HTTP/2协议的无加密服务器。参数:options:配置对象,可选,用于指定服务器的设置(如超时、允许的请求头、请求头大小限制等)。onRequest:回调函数,可选,接收request和response对象,与传统的HTTP服务器类似。constserver=http2.createServer((req,res)=>{res.writeHead(200,{'Content-Type':'text/plain'});res.end('Hello,HTTP/2!');});server.listen(3000,()=>{console.log('HTTP/2serverrunningathttp://localhost:3000');});2.2http2.createSecureServer([options][,onRequest])功能:创建一个支持HTTP/2协议的加密服务器(HTTPS)。参数:options:配置对象,必须包含SSL/TLS证书和私钥。onRequest:回调函数,可选,接收request和response对象。constfs=require('fs');constserver=http2.createSecureServer({key:fs.readFileSync('server-key.pem'),cert:fs.readFileSync('server-cert.pem')},(req,res)=>{res.writeHead(200,{'Content-Type':'text/plain'});res.end('Hello,SecureHTTP/2!');});server.listen(8443,()=>{console.log('SecureHTTP/2serverrunningathttps://localhost:8443');});3.HTTP/2客户端3.1http2.connect(authority[,options][,listener])功能:创建一个HTTP/2客户端连接。参数:authority:目标服务器的URL。options:配置对象,可选,用于设置连接的各种选项(如ALPN协议、TLS设置等)。listener:可选的回调函数,在connect事件发生时调用。constclient=http2.connect('https://localhost:8443',{ca:fs.readFileSync('server-cert.pem')//信任自签名证书});client.on('connect',()=>{console.log('Connectedtoserver!');});client.on('error',(err)=>console.error(err));4.HTTP/2流HTTP/2使用流来管理客户端和服务器之间的数据传输。一个流可以承载一个请求/响应周期。4.1session.request(headers[,options])功能:在客户端上启动一个新的HTTP/2请求。参数:headers:请求头对象,必须包含:method和:path字段。options:配置对象,可选,用于设置流选项(如优先级、超时等)。constreq=client.request({':method':'GET',':path':'/'});req.on('response',(headers)=>{console.log('Responseheaders:',headers);});req.on('data',(chunk)=>{console.log('Responsebody:',chunk.toString());});req.on('end',()=>{console.log('Responseended.');client.close();});req.end();4.2stream.respond(headers[,options])功能:服务器端响应请求,发送响应头。参数:headers:响应头对象。options:配置对象,可选,用于设置流选项。constserver=http2.createServer();server.on('stream',(stream,headers)=>{stream.respond({':status':200,'content-type':'text/plain'});stream.end('Hello,HTTP/2!');});server.listen(3000);4.3stream.pushStream(headers[,options][,callback])功能:服务器端推送数据到客户端(服务器推送)。参数:headers:请求头对象。options:配置对象,可选,用于设置流选项。callback:回调函数,当流已经创建或发生错误时调用。server.on('stream',(stream,headers)=>{stream.respond({':status':200,'content-type':'text/html'});stream.end('<h1>Hello,HTTP/2!</h1>');//服务器推送stream.pushStream({':path':'/pushed'},(err,pushStream)=>{if(err)throwerr;pushStream.respond({':status':200,'content-type':'text/plain'});pushStream.end('Thisisapushedresource.');});});4.4stream.on(event,listener)功能:监听流上的特定事件。常用事件:'aborted':当请求或响应被中止时触发。'close':当流关闭时触发。'data':当有数据可读时触发。'end':当数据流结束时触发。'error':当发生错误时触发。stream.on('data',(chunk)=>{console.log('Receiveddata:',chunk.toString());});stream.on('end',()=>{console.log('Streamended.');});5.HTTP/2会话HTTP/2会话用于管理客户端与服务器之间的多个流。5.1session.settings([settings][,callback])功能:设置HTTP/2会话的配置。参数:settings:一个对象,用于配置会话(如最大帧大小、最大并发流数等)。callback:设置完成后的回调函数。client.settings({enablePush:true},()=>{console.log('Settingsupdated.');});5.2session.ping([payload][,callback])功能:发送一个HTTP/2ping帧。参数:payload:可选的8字节数据。callback:回调函数,在接收到pong响应时调用。client.ping((err,duration)=>{if(err)throwerr;console.log(`Pingduration:${duration}ms`);});5.3session.close([callback])功能:优雅地关闭HTTP/2会话。参数:callback:可选的回调函数,会话关闭时调用。client.close(()=>{console.log('Clientsessionclosed.');});5.4session.destroy([error][,code])功能:强制销毁HTTP/2会话。参数:error:可选的错误对象,解释销毁的原因。code:可选的错误代码。client.destroy(newError('Somethingwentwrong'));5.5session.on(event,listener)功能:监听会话上的特定事件。常用事件:'close':当会话关闭时触发。'connect':当客户端与服务器成功连接时触发。'error':当会话发生错误时触发。'goaway':当接收到GOAWAY帧时触发,表示服务器要关闭连接。'ping':当接收到ping帧时触发。'stream':当服务器端创建新流时触发。client.on('error',(err)=>{console.error('Sessionerror:',err);});client.on('goaway',(errorCode,lastStreamID,opaqueData)=>{console.log('ReceivedGOAWAYframe');});6.HTTP/2状态码和头信息在HTTP/2中,状态码和头信息在处理请求和响应时起着重要作用。6.1常见的HTTP/2头字段:method:HTTP方法,例如GET或POST。**`:path**:请求的路径,例如/index.html`。:authority:请求的主机和端口,例如example.com。:scheme:请求的协议,例如https。6.2设置响应头和状态码在HTTP/2中,响应头和状态码通过stream.respond()设置。stream.respond({':status':200,'content-type':'text/html'});7.总结http2模块为Node.js提供了对HTTP/2协议的全面支持。通过多路复用、服务器推送、头部压缩等特性,可以显著提升网络性能。理解和使用这些属性和方法可以帮助开发者充分利用HTTP/2的优势来构建高效的网络应用。

nodejs 19 4天前
NodeJs-HTTP
小卒子

NodeJs-HTTP

Node.js的http模块用于创建HTTP服务器和客户端。它是构建网络应用(如Web服务器)的核心模块之一。以下是http模块中相关属性及方法的详尽介绍:1.引入http模块在使用HTTP功能前,需要先引入http模块:consthttp=require('http');2.创建HTTP服务器2.1http.createServer([requestListener])功能:创建一个新的HTTP服务器对象。参数:requestListener:可选的回调函数,会在接收到请求时触发。requestListener有两个参数:request(客户端请求)和response(服务端响应)。constserver=http.createServer((req,res)=>{res.statusCode=200;//设置HTTP状态码res.setHeader('Content-Type','text/plain');//设置响应头res.end('Hello,World!\n');//结束响应并发送内容});2.2server.listen(port[,hostname][,backlog][,callback])功能:让服务器监听指定的端口和主机名。参数:port:要监听的端口号。hostname:要监听的主机名(可选),默认为localhost。backlog:挂起的最大连接数(可选)。callback:服务器开始监听时的回调函数(可选)。server.listen(3000,'127.0.0.1',()=>{console.log('Serverisrunningathttp://127.0.0.1:3000/');});2.3server.close([callback])功能:关闭服务器,停止接收新连接。参数:callback:服务器关闭后的回调函数。server.close(()=>{console.log('Serverhasbeenclosed.');});2.4server.on(event,listener)功能:监听服务器上的特定事件。常用事件:'request':当接收到请求时触发。'connection':当客户端与服务器建立连接时触发。'close':当服务器关闭时触发。'error':当服务器发生错误时触发。server.on('request',(req,res)=>{console.log(`Receivedrequestfor${req.url}`);});server.on('error',(err)=>{console.error('Servererror:',err);});3.HTTP请求对象(http.IncomingMessage)IncomingMessage对象表示HTTP请求,并包含以下常用属性和方法:3.1req.method功能:返回请求的方法(如GET、POST)。console.log(req.method);//输出:请求方法3.2req.url功能:返回请求的URL。console.log(req.url);//输出:请求的URL3.3req.headers功能:返回请求头对象,包含请求的所有头部信息。console.log(req.headers);//输出:请求头信息3.4req.on(event,listener)功能:监听请求的特定事件。常用事件:'data':当请求数据到达时触发,用于处理数据流。'end':当请求数据全部接收完毕时触发。letbody='';req.on('data',chunk=>{body+=chunk;});req.on('end',()=>{console.log('Body:',body);});4.HTTP响应对象(http.ServerResponse)ServerResponse对象用于向客户端发送HTTP响应。以下是常用属性和方法:4.1res.statusCode功能:设置响应的状态码。res.statusCode=404;//设置状态码为4044.2res.statusMessage功能:设置状态消息。res.statusMessage='NotFound';//设置状态消息为"NotFound"4.3res.setHeader(name,value)功能:设置单个HTTP头。res.setHeader('Content-Type','text/html');4.4res.getHeader(name)功能:获取已设置的响应头的值。console.log(res.getHeader('Content-Type'));//输出:text/html4.5res.removeHeader(name)功能:移除已设置的响应头。res.removeHeader('Content-Type');4.6res.write(chunk[,encoding][,callback])功能:将数据块写入响应主体。可以多次调用此方法以发送响应的多个部分。res.write('<h1>Hello,World!</h1>');4.7res.end([data][,encoding][,callback])功能:结束响应。可以选择性地在结束时发送数据。res.end('Goodbye!');//结束响应并发送数据4.8res.writeHead(statusCode[,statusMessage][,headers])功能:直接设置状态码、状态消息和响应头,并一次性发送。res.writeHead(200,'OK',{'Content-Type':'text/plain'});5.创建HTTP客户端5.1http.request(options[,callback])功能:发起一个HTTP请求。参数:options:包含请求方法、主机名、端口、路径、头信息等配置的对象。callback:请求完成后调用的回调函数,接收一个response对象。constoptions={hostname:'www.example.com',port:80,path:'/path',method:'GET',headers:{'Content-Type':'application/json'}};constreq=http.request(options,(res)=>{letdata='';res.on('data',(chunk)=>{data+=chunk;});res.on('end',()=>{console.log('Response:',data);});});req.on('error',(e)=>{console.error(`Requesterror:${e.message}`);});req.end();//发送请求5.2http.get(options[,callback])功能:发起一个HTTPGET请求。这个方法是http.request()的简化版,用于GET请求。http.get('http://www.example.com',(res)=>{letdata='';res.on('data',(chunk)=>{data+=chunk;});res.on('end',()=>{console.log('Response:',data);});});6.处理HTTPS请求Node.js还提供了https模块用于处理HTTPS请求。https模块的API与http模块几乎相同,只是它需要SSL/TLS证书。consthttps=require('https');constoptions={hostname:'example.com',port:443,path:'/',method:'GET',headers:{'Content-Type':'application/json'}};constreq=https.request(options,(res)=>{letdata='';res.on('data',(chunk)=>{data+=chunk;});res.on('end',()=>{console.log('Response:',data);});});req.on('error',(e)=>{console.error(`Requesterror:${e.message}`);});req.end();7.HTTP/2支持Node.js还支持HTTP/2协议,通过http2模块提供支持。HTTP/2是HTTP协议的增强版,提供更高效的数据传输方式。7.1创建HTTP/2服务器consthttp2=require('http2');constfs=require('fs');constserver=http2.createSecureServer({key:fs.readFileSync('server-key.pem'),cert:fs.readFileSync('server-cert.pem')});server.on('stream',(stream,headers)=>{stream.respond({'content-type':'text/html',':status':200});stream.end('<h1>Hello,HTTP/2!</h1>');});server.listen(8443);8.HTTP代理支持Node.js可以使用http-proxy等模块来处理HTTP代理。HTTP代理用于将客户端的请求转发到其他服务器。consthttp=require('http');consthttpProxy=require('http-proxy');constproxy=httpProxy.createProxyServer({});constserver=http.createServer((req,res)=>{proxy.web(req,res,{target:'http://localhost:9000'});});server.listen(8000);9.HTTP头处理Node.js提供了一些便捷的工具用于解析和设置HTTP头部。9.1res.setHeader(name,value)和res.getHeader(name)用于设置和获取响应头。9.2req.headers包含所有请求头信息的对象。可以通过req.headers['header-name']获取特定头信息。10.HTTP状态码HTTP状态码由三位数字组成,用于表示服务器响应的状态。常见的状态码包括:200:OK,表示请求成功。301:MovedPermanently,表示资源已永久移动。400:BadRequest,表示请求无效。401:Unauthorized,表示请求需要身份验证。404:NotFound,表示请求的资源不存在。500:InternalServerError,表示服务器内部错误。通过res.statusCode可以设置响应的状态码。res.statusCode=404;//设置状态码为404res.end('NotFound');11.处理请求体当处理POST或PUT请求时,通常需要处理请求体。以下是一个处理JSON数据的示例:constserver=http.createServer((req,res)=>{if(req.method==='POST'){letbody='';req.on('data',(chunk)=>{body+=chunk.toString();});req.on('end',()=>{constparsedData=JSON.parse(body);console.log('Receiveddata:',parsedData);res.end('Datareceived');});}else{res.end('OnlyPOSTrequestsaresupported');}});server.listen(3000);12.结论Node.js的http模块提供了强大的工具来构建HTTP服务器和客户端。通过理解和使用这些属性和方法,你可以创建功能丰富的网络应用,并处理从基本请求响应到高级HTTP/2的各种需求。

nodejs 19 4天前
NodeJs-Globals
小卒子

NodeJs-Globals

在Node.js中,Globals是全局可用的对象和函数,这意味着你可以在任何模块中使用它们,而不需要通过require()语句引入。以下是Node.js全局对象及其相关属性和方法的详细介绍:1.__dirname和__filename__dirname:返回当前模块文件所在的目录的绝对路径。console.log(__dirname);//输出:当前文件所在的目录路径__filename:返回当前模块文件的绝对路径。console.log(__filename);//输出:当前文件的绝对路径2.consoleNode.js的console对象提供了一组简单的打印方法来输出到标准输出和标准错误。console.log([data][,...args]):用于输出信息到标准输出(stdout)。console.log("Hello,World!");//输出:Hello,World!console.error([data][,...args]):用于输出错误信息到标准错误(stderr)。console.error("Anerroroccurred!");//输出错误信息console.warn([data][,...args]):类似于console.error,用于输出警告信息。console.info([data][,...args]):类似于console.log,用于输出普通信息。console.dir(obj[,options]):输出一个对象的属性,并可以指定选项(如是否显示隐藏属性)。console.dir({name:"Alice",age:25},{colors:true});console.time(label)和console.timeEnd(label):用于计时操作,常用于性能分析。console.time("loop");for(leti=0;i<1000000;i++){}console.timeEnd("loop");//输出运行时间3.processprocess是一个全局对象,提供有关当前Node.js进程的信息和控制。process.argv:返回一个数组,包含启动Node.js进程时传入的命令行参数。console.log(process.argv);//输出命令行参数列表process.env:返回一个包含用户环境信息的对象。console.log(process.env.PATH);//输出PATH环境变量process.exit([code]):退出当前进程。可选的code参数是退出码,默认为0。process.exit(1);//退出进程并返回1作为退出码process.cwd():返回当前工作目录。console.log(process.cwd());//输出当前工作目录process.memoryUsage():返回一个对象,包含Node.js进程的内存使用情况。console.log(process.memoryUsage());//输出内存使用情况process.nextTick(callback):在事件循环的下一个周期中调用callback。process.nextTick(()=>{console.log("Thiswillruninthenexteventloopcycle");});4.globalglobal对象是一个Node.js全局对象,所有模块都可以访问。定义在global对象上的任何内容都可以被任何模块访问。global.setTimeout(callback,delay[,...args]):定时执行回调函数。global.setTimeout(()=>{console.log("Executedafter2seconds");},2000);global.setInterval(callback,delay[,...args]):定期执行回调函数。global.setInterval(()=>{console.log("Executedevery2seconds");},2000);global.clearTimeout(timeoutObject):停止通过setTimeout()创建的计时器。global.clearInterval(intervalObject):停止通过setInterval()创建的计时器。5.module和exportsmodule:表示当前模块。通过module.exports可以导出模块的内容。exports:是一个快捷方式,等同于module.exports。初始值是一个空对象{},用于导出模块内容。//example.jsmodule.exports.sayHello=function(){console.log("Hello,World!");};//main.jsconstexample=require('./example');example.sayHello();//输出:Hello,World!6.require()require()是一个用于引入模块的函数,允许你加载Node.js内置模块、第三方模块或自定义模块。constfs=require('fs');//引入文件系统模块constcustomModule=require('./customModule');//引入自定义模块7.BufferBuffer是用于处理二进制数据的类,允许在不需要单独使用数据流的情况下操作文件或数据。创建Buffer实例:constbuf=Buffer.from('HelloWorld');//通过字符串创建Bufferconsole.log(buf.toString());//输出:HelloWorld8.setImmediate()setImmediate()是一种特殊的计时器,用于在事件循环的当前周期结束时执行代码。它比setTimeout更有效率,因为它不需要等待时间。setImmediate(()=>{console.log("ThisrunsimmediatelyafterI/Oevents");});9.clearImmediate()clearImmediate()用于停止由setImmediate()创建的立即执行。constimmediate=setImmediate(()=>{console.log("Thiswillnotrun");});clearImmediate(immediate);10.queueMicrotask()queueMicrotask()方法允许你将一个函数添加到JavaScript微任务队列中。微任务在事件循环的每一个阶段之间运行。queueMicrotask(()=>{console.log("ThiswillrunafterthecurrentscriptbutbeforeanyotherI/Oevents");});11.TextEncoder和TextDecoderTextEncoder和TextDecoder是用于处理文本编码和解码的全局类,特别是处理UTF-8编码。TextEncoder:constencoder=newTextEncoder();constuint8Array=encoder.encode('HelloWorld');console.log(uint8Array);//输出:Uint8Array([...])TextDecoder:constdecoder=newTextDecoder('utf-8');consttext=decoder.decode(uint8Array);console.log(text);//输出:HelloWorld总结Node.js提供了丰富的全局对象和方法,可以帮助你在各种情况下快速编写代码。通过了解和使用这些全局对象和方法,你可以更高效地进行Node.js开发。

nodejs 24 4天前
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 >> 尾页 共 38 页