node.js的简单介绍+如何使用fs模块实现文件读写+如何使用http模块创建web服务器

1,067 阅读11分钟

node.js

概念:

node.js是一个运行js的环境---Chrome和node都是基于Chrome V8引擎执行js的。

node和浏览器的差异:

1、主要是内置api不一样;

2、浏览器是js的前端运行环境,node是js的后端运行环境;

3、在浏览器端:js由三部分组成:ECMAScript + BOM + DOM;

4、在NoeJS端:由ECMAScript + 内置模块(fs, http, path等) + 第三方模块(别人开发的模块)。

主要学习:

1、通过npm工具来安装,卸载第三方包;

2、学会下包;

3、内置模块、自定义模块、第三方模块。

作用:

1、使自己的技术更加全面;

2、为后面学习Vue等框架打下基础;

3、理解为一个容器,用来运行js代码的环境;这个环境让js有读写文件,操作数据库,开启web服务器等能力。

node安装:

1、到nodejs.org/zh-cn/网页下载长…

2、下载完安装包,一步步默认安装即可---注意不能存储在中文目录下,安装完也不会在桌面出现快捷图标;

3、打开小黑窗输入 ‘node -v’ 能看到版本号则表示安装成功。

image-20220509091917730

用法:

node是在小黑窗里运行js文件的。

1、新建一个js文件;

2、在小黑窗里输入代码执行这个js文件---注意:要进入到js文件所在的文件夹,然后才能运行js文件。

如:image-20220509093435434

属性:

打开小黑窗的方法:

image-20220509092811574

小黑窗操作node快捷键:

image-20220509094658508

注意点:

Node.js 只是JS的服务端运行环境,不是一门语言(不需要学习新语言),而只需要学习它里面新的Api。

如果node所运行的js文件,是不能运行涉及浏览器功能的代码的,比如(alert(‘aa’),BOM节点,DOM节点等等),但是它可以运行js的基础语法。

node模块

概念:

模块也是一个对象,是node的重要组成部分。

属性:

核心模块:就是nodejs自带的模块,在安装完nodejs之后,就可以任意使用啦。相当于学习js时使用的Math对象一样。

自定义模块:程序员自己写的模块。相当于我们在学习js时的自定义函数。

第三方包:其他程序员写好的模块,nodejs生态提供了一个专门的工具npm来管理第三方模块,例如我们前面学习的echarts等。

用法:

我怎么去找到核心模块呢?

答:直接在nodeapi官网查找---能在官网找到的模块都为核心模块,如果不能找到,则是第三方模块,或者自定义模块。

fs.readFile异步读取文件内容

概念:

是fs模块里的一个方法;管文件大小,代码的执行顺序,是看文件读取完的先后来决定。

作用:

fs.readFile方法可以异步读取文件。

语法:

"fs.readFile(path,[, options], callback)"

---参数:

path:读取文件的路径(相对路径或绝对路径);

options:读取文件的参数配置----[, options]-可以不写;

callback:读取完毕的回调函数(err,data)=>{} ----err表示读取失败返回的数据,data表示读取成功返回的数据。

用法:

1、定义被读取的文本image-20220509111114028

2、定义读取文件的js,并用node运行js。

image-20220509110842756

读取成功:data原样输出返回缓存数据,加上toString()方法则返回文件里的内容‘hello’;err则返回null。

读取失败:err原样输出为报错,加上message属性则显示具体报错信息;data则返回undefined。

注意点:

1、执行此方法,必须导入fs模板;

2、[, options]如果设置为utf8,那么我们就能得到和文件内容一样的数据,不再是二进制buffer格式,不过此时的内容是字符串格式的。另外中括号表示可写可不写的参数。

fs.readFileSync同步读取文件内容

概念:

readFileSync()是fs模板里的一个方法;不管文件大小,始终是按顺序执行代码。

作用:

fs.readFileSync()方法可以同步读取文件。

语法:

"let res = fs.readFileSync( path, [ , options ] )"

参数: res:自定义变量名,用来接收读取的数据;

​ path:读取文件的路径(相对路径或绝对路径);

​ options:读取文件的参数配置,通常用一个utf8字符串表示即可---[, options]-可以不写 。

用法:

1、定义被读取文本image-20220509111114028

2、定义读取文件的js,并用node运行js

image-20220509132006462

3、结果

image-20220509132112758

注意: fs.readFileSync(path,[, options])整体就为同步读取的文件的内容,直接用变量接收。

注意点:

1、读取文本内容文件时,utf8参数要加上,不然打印出来的是一个Buffer二进制内容,

image-20220509131233499

加上utf8打印出来的就是文件内容,不过是字符串格式;

image-20220509131337304

2、使用同步获取,要想有错误提示,就要引入try catch;

3、'[, options]'是一般在读人家接口的时候会出现,中括号表示可写可不写的参数。

fs.writeFile异步写入内容

概念:

异步向文件里写入内容。

特点:

writeFile方法是覆盖式写入,后面的内容会将前面的内容覆盖。

语法:

"fs.writeFile( path,data,[ ,options], callback)"

参数: path:被写入文件的路径(相对路径或绝对路径); data:要写入的内容,字符串格式; options:写入文件的参数配置,----可以省略; callback:写入完毕的回调函数(err)=>{} ----err值为写入的状态,比如写入失败或者成功。

用法:

image-20220509151705692

注意点:

如果path路径存在,但没有这个文件,那么writeFile会新建一个文件,并写入内容;如果path路径都不存在,则报错。

fs.writeFileSync同步写入内容

概念:

同步向文件里写入内容。

特点:

writeFileSync方法也是覆盖式写入,后面的内容会将前面的内容覆盖。

语法:

'fs.writeFileSync ( path,data [, options] )'

参数: path,被写入文件的路径(相对路径或绝对路径); data,要写入的内容,字符串格式; options:写入文件的参数配置,默认是utf8编码---可以省略

用法:

image-20220509201925147

注意点:

1、如果path路径存在,但没有这个文件,那么writeFileSync会新建一个文件,并写入内容;如果path路径都不存在,则报错。

2、使用同步写入,要想有错误提示,就要引入try catch;

3、fs.writeFileSync整体没有返回值,为undefined。

引入:try catch

概念:

算是一种查错的语句;err表示为接收到的错误信息。

原理:

当try大括号里的内容出错了,就会执行catch大括号里的内容---和if( ){ xxx }else{ xxx }执行步骤类似

语法:

try { 放有可能出错的代码 } catch(error) { 报错后执行的代码,通常是输出错误 }

使用场景:

前提: "fs.readFileSync同步读取文件内容"由于此表达式本身不带回调函数,所以我们无法知道,读取文件是否成功进行,那么我们就可以利用try和catch语句实现排查。如下:

image-20220509202131590

结果:image-20220509202041830

http模块

概念:

http模块也是一个对象,是node的重要组成部分。

作用:

是用来写web服务器的。

web服务器:

1、用户通过浏览器来享受web服务器提供的图片,视频,音频等网页内容浏览的服务;

2、用户用url地址来访问某个web服务器上的资源;

3、浏览器端发起请求,web服务器收到请求后,响应这个请求,并将处理结果返回给浏览器;

4、浏览器端与web服务器是通过http(或者是https)协议来进行请求和响应的。

创建web服务器所涉及的方法:

1、require()

引入http核心模块require('http'),整体得到的是一个对象。这个对象可以用来创建服务器。

2、createServer():

介绍:

是require('http')对象里的一个方法用来创建一个http服务;

createServer方法参数是一个回调函数:当有http请求进来时,它会自动被调用,请求一次,它就被调用一次;

request

request简写(req)是回调函数的第一参数:客户端的请求报文;

req里的主要属性:

1、method:获取客户端请求的方式;

2、url:url获取客户端地址"/"之后的内容,以/开头。---如果地址里没有"/"数据,则req的url属性值默认为"/";

3、body:body获取客户端传过来的请求体数据,post和put请求所携带的数据就为body数据;

4、query:获取客户端传过来的query数据,get和delete请求所携带的数据就为query数据。

response

response简写(res)是回调函数的第二参数:设置对本次请求的响应报文;

res里的主要方法与属性:

1、end() ---小括号里的内容,表示为请求的响应数据,而且有结束本次请求的作用,默认情况下只能传入buffer或者是String类型的数据;

2、setHeader(响应头,响应值)---如果end()里想传入中文或其他字符,就需要在end方法前面设置setHeader方法。

如:res.setHeader(“Content-Type”,”text/html;charset=utf8”)--可以解决,在end方法里放入中文,浏览器显示乱码的问题。

----注意: 一次请求只能有一个res.end()响应,如果设置了多个则以第一个响应的数据为准,同时服务器报错终止

3、statusCode---属性:服务器给前端返回的状态码。也要写在end()方法前面才有效。

3、listen()

( require('http').createServer() ).listen() 用来监听服务器,并且给服务器设置端口号:

listen里有两个参数,第一个参数表示端口号,第二个参数表示回调函数。

如果监听成功,则回调函数会执行一次;

如果不成功(例如端口被占用),会报错。

如:image-20220509201218475

使用步骤:

1、引入http核心模块;

2、使用createServer来创建服务;

3、使用listen来启动服务,端口为8001(端口可以修改 0 - 65535);

4、在浏览器输入 http://127.0.0.1:8001回车即可看到服务器响应回来的信息:OK;

5、我们也可以通过ipconfig查看本机ip,再通过 http://局域网ip:8001回车访问服务器。

image-20220509171732558

注意点:

end()只能传入buffer或者是String类型的数据---不了解的情况下,不建议写中文。

image-20220509195623044

测试api接口工具Apipost

Apipost是一款api接口的测试工具,可以模拟get,post,文件上传等请求。

下载地址:Apipost

拓展:

域名:

ip地址的别名,如:www.baidu.com;

由于ip地址不好记忆,我所以给它们取个好记的别名;

127.0.0.1 的别名为 localhost;

系统自动解析的,不需要做额外的配置。

服务器类型:

1、web服务器(重点学习) 安装apache/tomcat/iis或者在nodejs环境写代码来提供:图片/视频/音频浏览/新闻数据浏览等 服务的服务器; 2、ftp服务器 安装serv-U软件,为其它电脑提供文件下载,共享服务; 3、数据库服务器 安装mysql软件,为其它电脑提供数据库服务。

端口:

一个网络设备可以有65536个端口,范围是从[0,65535]); 不同的端口被不同的软件占用,以提供不同的服务; 服务器要提供服务必须要通过指定的端口; 客户端与服务器都需要通过特定端口要进行通信(http://157.122.54.189:9092); 端口是可以编程分配; 有一些端口号是被预定了的,如:http:80、https:443、mysql:3306 。

协议:

概念:

制定客户端与服务器之间的通讯规则,不同的协议的作用也不同,我们主要了解HTTP协议。

http协议

HTTP(HyperText Transfer Protocol) 超文本传输协议,浏览器与web服务器都要遵守的协议; HTTP 协议中明确规定了请求数据和响应数据的格式(报文)。

---浏览器请求资源,遵循http协议,即请求报文;服务器返回资源遵循http协议,即响应报文。

content-type

作用:

在http协议中,content-type用来告诉对方本次传输的数据的类型是什么。

解释:

在请求头中设置content-type来告诉服务器,本次请求携带的数据是什么类型的; 在响应头中设置content-type来告诉浏览器,本次返回的数据是什么类型的; res.setHeader方法可以设置content-type这个响应头,浏览器根据不同类型做出不同解析。

属性:

image-20220510100632723

注意:

请求头和响应头都可以设置content-type;

如果读取.html的文件内容,但是content-type设置为了text/css则浏览器将不会当作是html页面来渲染了。