# node-js资料 **Repository Path**: deer-renjia/node-js-data ## Basic Information - **Project Name**: node-js资料 - **Description**: 在学习中,待更新 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-02-12 - **Last Updated**: 2022-02-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 在Node.js环境中执行JavaScript代码 node+指定文件的路径+文件名即可执行(前提是js文件) 1.终端中的快捷键 在Windows的powershell或者cmd终端中,可以通过如下快捷键,来提高终端的操作效率: ①使用↑键,可以快速定位到上一次执行的命令 ②使用tab键,能够快速补全路径 ③使用esc键,能够快速清空当前已经输入的命令 ④输入cls命令,可以清空终端 2.fs文件系统模块 ##什么是fs文件系统模块 fs模块是Node.js官方提供的、用来操作文件的模块。它提供了一系列的方法和属性,用来满足用户对文件的操作要求。 例如: fs.readFile()方法,用来读取指定文件中的内容 fs.writeFile()方法,用来向指定的文件中写入内容 ##读取指定文件中的内容 ①fs.readFile()的语法格式 使用公共fs.readFile()方法,可以读取指定文件中国的内容,语法格式如下: fs.readFile(path[,options],callback) 参数: 参数1:必选参数,字符串,表示文件的路径 参数2:可选参数,表示以什么编码格式来读取文件 参数3:必选参数,文件读取完成后,通过回调函数拿到读取的结果 ##判断文件是否读取成功 可以判断err对象是否为null,从而知晓文件读取的结果: ##向指定的文件中写入内容 ①fs.writeFile()的语法格式 使用fs.writeFile()方法,可以向指定的文件中写入内容,语法格式如下: fs.writeFile(file,data[,options],callback) 参数: 参数1:必选参数,需要指定一个文件路径的字符串,表示文件的存放路径 参数2:必选参数,表示要写入的内容 参数3:可选参数,表示以什么格式写入文件内容,默认值是utf8 参数4:必选参数,文件写入完成后的回调函数 ##判断文件是否写入成功 可以判断error对象是否为null,从而知晓文件写入的结果 ##练习——考试成绩整理 核心实现步骤 ①导入需要的fs文件系统模块 ②使用fs.readFile()方法,读取素材目录下的 成绩.txt 文件 ③判断文件是否读取失败 ④文件读取成功后,处理成绩数据 ⑤将处理完成的成绩数据,调用fs.writeFile()方法,写入到新文 成绩-0k.txt 中 ##fs模块——路径动态拼接的问题 在使用fs模块操作文件时,如果提供的操作路径是以./或者../开头的相对路径出现时,很容易出现路径动态拼接错误的问题 原因:代码在运行的时候,会以执行node命令时所处的目录,动态拼接处被操作文件的完整路径。 3.path路径模块 ##什么是path路径模块 path模块是Node.js官方提供的、用来处理路径的模块。它提供了一系列的方法和属性,用来满足用户对路径的处理需求。 例如: path.join()方法,用来将多个路径片段拼接成一个完整的路径字符串 path.basename()方法,用来从路径字符串中,将文件名解析出来 如果要在JavaScript代码中,使用path模块来处理路径,则需要使用如下的方式先导入它: const path=require("path"); ##path.join()的语法格式 使用path.join()方法,可以把多个路径片段拼接位完整的路径字符串,语法格式如下: path.join([...paths]); 参数: ...paths 路径片段序列 返回值: ##path.basename()方法,可以获取路径中的最后一部分,经常通过这个方法获取路径中的文件名,方法如下: path.basename(path[,ext]); 参数: path 必选参数,表示一个路径的字符串 ext 可选参数,表示文件扩展名 返回: 表示路径中的最后一部分 ##path.extname()的语法格式 使用path.extname()方法,可以获取路径中的扩展名部分,语法格式如下: path.extname(path); 参数: path 必选参数,表示一个路径的字符串 返回:返回得到的扩展名字符串 ##综合案例——时钟案例 ##案例的两个注意点 ①fs.writeFile()方法只能用来创建文件,不能用来创建路径 ②重复调用fs.writeFile()写入同一个文件,新写入的内容会覆盖之前的旧内容 4.http模块 ##什么是http模块 什么是客户端?什么是服务器 在网络节点中,负责消费资源的电脑,叫做客户端;负责对外提供网络资源的电脑,叫做服务器 http模块是Node.js官方提供的、用来创建web服务器的模块。通过http模块提供的http.createServer()方法,就能方便的把一台普通的电脑,变成一台Web服务器,从而对外提供Web资源服务。 如果需要使用http模块创建Web服务器,则需要先导入它: const http=require("http"); ##进一步理解http模块的作用 服务器和普通电脑的区别在于,服务器上安装了web服务器软件,例如:IIS、Apache等。通过安装这些服务器软件,就能把一台普通的电脑变成一台web服务器。 注意:网站中127.0.0.1相当于localhost 其中端口80是默认端口(如果修改了默认端口的话,那么就需要额外输入指定端口) 在Node.js中,我们不需要使用IIS、Apache等这些第三方web服务器软件。因为我们可以基于Node.js提供的http,模块,通过几行简单的代码,就能轻松的手写一个服务器软件,从而对外提供的web服务。 ##服务器相关的概念 ##IP地址: IP地址就是互联网上每台计算机的唯一地址,因此IP地址具有唯一性。如果把“个人电脑”比作“一台电话”,那么“IP地址”就相当于“电话号码”,只有在知道对方IP地址的前提下,才能与对应的电脑之间进行通讯。 IP地址的格式:通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a、b、c、d都是0~255之间的十进制整数。例如:用点分十进制表示的IP地址(192.168.1.1) 注意: ①互联网中每台web服务器,都有自己的IP地址,例如:大家可以在Windows的终端中运行ping www.baidu.com命令,即可查看到百度服务器的IP地址。 ②在开发期间,自己的电脑既是一台服务器,也是一个客户端,为了方便测试,可以在自己的浏览器中输入127.0.0.1这个IP地址,就能把自己的电脑当做一台服务器进行访问。 不过仅限自己访问,而且127.0.0.1的默认端口是80(一般情况下,80端口会存在被占用情况。所以可以自主选择别的端口(我开100端口)) ##域名和域名服务器 尽管IP地址能够唯一地标记网络上的计算机,但IP地址是一长串数字,不直观,而且不便于记忆,于是人们又发明了另一套字符型的地址方案,即所谓的域名(Domain Name)地址。 IP地址和域名是一一对应的关系,这份对应关系存放在一种叫做域名服务器(DNS,Domain name server)的电脑中。使用者只需要通过好几的域名访问对应的服务器即可,对应的转换工作由域名服务器实现。因此,域名服务器就是提供IP地址和域名之间转换服务的服务器。 ①单纯使用IP地址,互联网中的电脑也能够正常工作,但是有了域名的加持,能让互联网世界变得更加方便。 ②在开发测试期间,127.0.0.1对应的域名是localhost,他们都代表我们自己的这台电脑,在使用效果上没有任何区别。 ##端口号 计算机中的端口号,就好像是现实生活中的门牌号一样。通过门牌号,外卖小哥可以在整栋大楼众多的房间中,准确把外卖送到你的手中。 同样的道理,在一台电脑中,可以运行成百上千哥哥web服务。每个web服务都对应一个唯一的端口号。客户端发送过来的网络请求,通过端口号,可以准确地被交给对应的web服务进行处理。 注意: ①,每个端口号不能同时被多个web服务占用。 ②在实际应用中,URL中的80端口可以被省略。 ##创建最基本的web服务器 ##创建web服务器的基本步骤 ①导入http模块 如果希望在自己的电脑上创建一个web服务器,从而对外提供web服务器,则需要导入http模块: const http=require("http"); ②创建web服务器实例 调用http.createServer()方法,疾控科快速创建一个web服务器实例: const server=http.createServer(); ③为服务器实例绑定request事件,监听客服端的请求。 使用服务器实例的.on()方法,为服务器绑定一个request事件 server.on("request",(request,response)=>{ //只要有客户端来请求我们自己的服务器,就会触发request事件,从而调用这个事件处理函数 console.log("有人请求了该服务器"); }); ④启动服务器 调用服务器实例的.listen()方法,即可启动当前web服务器实例: //调用server.listen(端口号,cb回调)方法,即可启动web服务器 server.listen(100,()=>{ console.log("http server running at http://127.0.0.1:100"); }); ##request请求对象 只要服务器接收到了客户端的请求,就会调用通过server.on()为服务器绑定的request事件处理函数,如果想在事件处理函数中,访问与客户端相关的数据或属性,可以使用如下的方式: server.on("request",(request)=>{ //request是请求对象,它包含了与客户端相关的数据和属性 //request.url是客户端请求的URL地址 //request.method是客户端的method请求类型 console.log("request.url",request.url); console.log("request.method",request.method); }); ##response响应对象 在服务器的request事件处理函数中,如果想访问与服务器相关的数据或属性,可以使用如下的方式: server.on("request",function(request,response){ //response是响应对象,它包含了与服务器相关的数据和属性 //要发送到客户端的字符串 console.log("request.url",request.url); console.log("request.method",request.method); //向客户端发送指定的内容,并结束这次请求的处理过程 response.end("request.url",request.url); response.end("request.method",request.method); }); ##解决中文乱码问题 当调用response.end()方法,向客户端发送中文内容的时候,会出现乱码问题,此时,需要手动设置内容的编码格式: response.setHeader("Content-Type","text/html; charset=utf-8"); ##根据不同的url响应不同的html内容 ##核心实现步骤 ①获取请求的url地址 ②设置默认的响应内容为 404 Not found ③判断用户请求的是否为/或者index.html ④判断用户请求的是否为/about.html关于页面 ⑤设置Content-TType响应头,防止中文乱码 ⑥使用response.end()把内容响应给客户端 ##实现clock时钟的web服务器 ##核心思路 把文件的实际存放路径,作为每个资源的请求url地址 浏览器 自己写的web服务器 磁盘目录 在浏览器中访问如下网址: 把文件的实际存放路径, +项目根目录 /clock/index.html ——————请求——————> 作为每个资源的请求url地址 ——————请求——————> ++clock /clock/index.js |--index.html /clock/index.css 因此,可以直接把请求的url |--index.css 地址,当做读取文件的路径 |--index.j 注意:: 项目根目录以/表示 客户端请求回来的,不是具体的文件, 将读取到的文件内容(字符串) 因此每个文件的存放路径: 而是文件中所储存的字符串 <——————响应—————— 通过res.end()响应客户端 <————读取完毕———— /clock/index.html /clock/index.css /clock/index.js 服务器充当的角色就是一个字符串的搬运工 ##实现步骤 ①导入需要的模块 ②创建基本的web服务器 ③将资源的请求url地址映射为文件的存放路径 ④读取文件内容并响应给客户端 ⑤优化资源的请求路径 ##需要导入的模块 const http=require("http"); const fs=require("fs"); const path=require("path"); ##创建基本的服务器 const server=http.createServer(); server.on("request",function(request,response){}); server.listen(100,function(){ console.log("端口号100的服务器正在运行"); }); ##获取到客户端请求的url地址 const url=req.url; ##把请求的url地址,映射为本地文件的存放路径 const newPath=path.join(__dirname,url); ##读取文件内容并且响应给客户端 fs.readFile(newPath,"utf8",(error,dataStr)=>{ if(error!==null) { return response.end("404 Not found"); } response.end(dataStr); }); ##优化资源的请求路径 //将预定空白的文件存放路径 let fpath=""; if(url=="/") { //请求的路径如果是/,则手动指定文件的存放路径 fpath=path.join(__dirname,"./clock/index.html"); } else { fpath=path.join(__dirname,"./clock",url); } 5.模块化 ##模块化的基本概念 ##什么是模块化 模块化是指解决一个复杂问题时,自顶向下逐层把系统划分成若干模块的过程。对于整个系列来说,模块是可组合、分解和更换的单元。 现实中的模块化例子: 红白机(FC游戏机) ##编程领域中的模块化 编程领域中的模块化,就是遵守固定的规则,把一个大文件拆成独立并互相依赖的多个小模块。 把代码进行模块化拆分的好处: ①提高了代码的复用性 ②提高了代码的可维护性 ③可以实现按需加载 ##模块化规范 模块化规范就是对代码进行模块化的拆分与组合时,需要遵守的那些规则。 例如: ●使用什么样的语法格式来引用模块 ●在模块中使用什么样的语法格式向外暴露成员 模块化规范的好处:大家都遵守同样的模块化规范写代码,降低了沟通的成本,极大方面了各个模块之间的相互调用,利人利己。 ##Node.js中模块的分类 Node.js中根据模块来源的不同,将模块分为了3大类,分别是: ●内置模块(内置模块是由Node.js官方提供的,例如fs、path、http等) ●自定义模块(用户创建的每个.js文件,都是自定义模块) ●第三方模块(由第三方开发出来的模块,并非官方提供的内置模块,也不是用户创建的自定义模块,使用前需要先下载) ##加载模块 使用require()方法,可以加载需要的内置模块、用户自定义模块、第三方模块进行使用 //加载内置模块 const fs=require("fs"); //加载自定义模块 const custom=require("./custom.js"); //加载第三方模块 const moment=require("moment"); 注意:使用require()方法加载其他模块时,会执行被加载模块中的代码。 ##Node.js中的模块作用域 ##什么是模块作用域 和函数作用域类似,在自定义模块中定义的变量、方法等成员,只能在当前模块内被访问,这种模块级别的访问限制,叫做模块作用域。 ##模块作用域的好处 防止了全局变量污染的问题 ##向外共享模块作用域中的成员 ##module对象 在每个.js自定义模块中都有一个module对象,它里面存储了和当前模块有关的信息,打印如下: Module { id: '.', path: 'H:\\node-js\\day2', exports: {}, filename: 'H:\\node-js\\day2\\06.model1.js', loaded: false, children: [], paths: [ 'H:\\node-js\\day2\\node_modules', 'H:\\node-js\\node_modules', 'H:\\node_modules' ] } ##module.exports对象 在自定义模块中,可以使用module.exports对象,将模块内的成员共享出去,供外界使用 外界用require()方法导入自定义模块时,得到的就是module.exports所指向的对象 ##共享成员时的注意点 使用require()方法导入模块时,导入的结果,永远以module.exports指向的对象为准 如果在前面给module.exports挂载了一些数据,最后又让module.exports本身直接指向某一个对象 那么在运行的时候,export提供的数据将是最后所直接指向的那个对象本身 ##exports对象 由于module.exports单词写起来比较复杂,为了简化向外共享成员的代码,Node提供了exports对象。默认情况下,exports和module.exports指向同一个对象。最终共享的结果,还是以module.exports指向的对象为准。 ##exports和module.exports的使用误区 时刻谨记,require()模块时,得到的永远是module.exports指向的对象: export.a=1; module.exports={ b:12, a:13 }; 输出时,得到的是module.exports指向的对象{b:12,a:13} 注意添加属性和赋值对象的区别 为了防止混乱,建议大家不要在同一个模块中同时使用exports和module.exports ##Node.js中的模块化 ##Node.js中的模块化规范 Node.js遵循了CommonJS模块化规范,CommonJSguiding了模块的特性和各模块之间如何互相依赖。 CommonJS规定: ①每个模块内部,module变量代表当前模块。 ②module变量是一个对象,它的exports属性(即module.exports)是对外的接口。 ③加载某个模块,其实是加载该模块的module.exports属性。require()方法用于加载模块。 6.npm与包 ##包 ##什么是包 Node.js中的第三方模块又叫做包。 就像电脑和计算机指的是相同的东西,第三方模块和包指的是同一个概念,只不过叫法不同。 ##包的来源 不同于Node.js中的内置模块与自定义模块,包是由第三方个人或者团队开发出来的,免费供所有人使用。 注意:Node.js中的包都是免费且开源的,不需要付费即可免费下载使用。 ##为什么需要包 由于Node.js的内置模块仅提供了一些底层的API,导致在基于内置模块进行项目开发的时候,效率很低。包是基于内置模块封装出来的,提供了更高级、更方便的APT。极大地提高了开发效率。 包和内置模块之间的关系,类似于jQuery和浏览器内置API之间的关系。 ##从哪里下载包 国外有一家IT公司,叫做npm,lnc.这家公司旗下有一个非常注明的网站:https://www.npmjs.com/,它是全球最大的包共享平台,你可以从这个网站上搜索任何你需要的包,只要你有足够的耐心! 到目前为止,全球约1100多万的开发人员,通过这个包共享平台,开发并共享了超过120多万哥包供我们使用。 npm,lnc.公司提供了一个地址为https://registry.npmjs.org/的服务器,来对外共享所有的包,我们可以从这个服务器上下载自己所需要的包。 ##如何下载包 npm,lnc.公司提供了一个包管理工具,我们可以使用这个包管理工具,从https://registry.npmjs.org/服务器把需要的包下载到本地使用。 这个包管理工具的名字叫做Node Package Manager(简称npm包管理工具),这个包管理工具锁着Node.js的安装包哦一起被安装倒了用户的电脑上。 ##npm初体验 1.格式化时间的传统做法: ①创建格式化时间的自定义模块 ②定义格式化时间的方法 ③创建补零函数 ④从自定义模块中导出格式化时间的函数