node-day1
(1)为什么学习node?



服务器为中间件
学习node.js便是为了帮助前端开发人员 打开服务器的黑盒子,了解接口制作、数据处理等,以便更好地配合后端进行协同开发
案例:node.js中文社区系统(多人社区)

(2)什么是node?
前端:HTML、CSS、JS
服务器端:node、java、PHP、Python、Ruby(案例:GitHub)、c#、.Net(dot点,发音为dao net)... ...都可以作为服务器端语言,都可以打开web后台服务器黑盒子。
node.js主要使用js编码

浏览器JS构成:

node.js中构成(服务端不处理页面,所以没有BOM和DOM)


node.js特性:
event-driven事件驱动、non-blocking I/O model非阻塞I/O模型
node.js生态库

小结:
node.js不是新语言、框架、库等,而是js在服务器端的运行环境。是基于Chrome的V8 JavaScript引擎构建的JavaScript运行时环境,浏览器引擎相关参考下面所示


(3)node介绍
1、node能做什么?

等等,主要为服务器和命令行工具
对于前端来说,主要使用node命令行工具

2、预备知识

3、学习资源

4、学习知识点

B/S编程模型:Browser与Server

模块化编程

异步编程

ES6

(4)node环境安装

1、 查看当前是否安装node或者已经安装好的版本号
node --version或者node -v

2、官网查看版本进行下载
LTS为Long Time Support长期支持版,即稳定版
Current为当前最新版


3、安装
注意:已经安装过的,再次安装会进行覆盖
一路next傻瓜式安装即可
4、验证版本,确认是否安装成功
5、配置环境变量

(5)使用node执行JS脚本文件
1、新建helloworld.js脚本

2、切换到脚本目录文件
CMD与Git Bash都可以


3、node执行脚本文件
如上所示
4、注意

脚本文件命名避免node.js或者中文

5、没有BOM与DOM验证



没有DOM与BOM操作,主要是服务器级别操作,例如读写文件
注意:浏览器中JS无法直接读取或者创建写入文件
6、浏览器js与node的js宏观对比---结合读写文件

1、使用require方法加载fs(file-system文件系统)核心模块 var fs = require('fs'); 2、读取文件 fs.readFile('读取文件路径','回调函数(error,data)')

案例如下:



默认存储为二进制数据,这里看到的之所以乱码,是因为二进制转为16进制了,通过toString转换即可


小结:

7、浏览器不认识node代码


(6)写文件和简单的错误处理
1、写文件API
writeFile()


案例如下:



2、完善--错误情况处理,自定义错误提示

错误时error为错误对象,包含具体错误信息

添加错误判断


3、写入文件加错误处理

4、小结
error参数作用:判断读写文件操作是否成功
(7)简单的http服务

之前首先利用node执行脚本文件,打印hello world;后来利用fs与API读写文件,接下来使用web服务器实现
核心模块:fs文件系统模块、http服务器模块
1、核心模块(宏观了解)
1、加载http核心模块 var http = require('http'); 2、创建web服务器 使用http.createServer()方法创建一个web服务器,返回一个server实例 var server = http.createServer() 3、服务器提供“数据”服务,接收请求
server.on('request',function(){...})
4、绑定端口号(3000、5000、8000,端口号下面介绍),启动服务器

验证如下:



问题:此时浏览器输入url后一直显示等待响应... ....

之所以会这样,主要因为当前只是接受请求request,还没有设置响应,所以接下来设置响应

(8)设置并发送响应
1、参数
request请求事件回调处理函数,需要接受两个参数:
Request请求对象(获取客户端一些请求信息,例如请求路径request.url)
Response响应对象(给客户端发送响应消息)

2、验证如下
/* 1、加载http核心模块 */ var http = require('http'); /*2、创建web服务器 使用http.createServer()方法创建一个web服务器,返回一个server实例*/ var server = http.createServer(); /*3、服务器提供“数据”服务,接收请求*/ /* request请求事件回调处理函数,需要接受两个参数: Request请求对象(获取客户端一些请求信息,例如请求路径) Response响应对象(给客户端发送响应消息) */ server.on('request',function(request,response){ console.log('收到客户端请求,请求路径为'+request.url) /* response对象有一个write方法,可以用来给客户端发送响应数据 write可以使用多次,但最后要用end结束响应,否则客户端会一直等待 */ //往response响应流中写数据 response.write('hello world') //告知客户端,服务器的话已经说完了,可以呈递给用户了 response.end(); }) /* 4、绑定端口号,启动服务器 */ server.listen(3000,function(){ console.log('服务器启动成功,可以通过localhost:3000进行访问')/*成功日志信息*/ })

注意:/favicon.icon为收藏夹图标,浏览器有个默认行为,会去请求收藏夹图标
3、思考:路由

根据不同请求路径,响应不同内容... ...
简单复习:

(9)根据不同请求路径返回不同数据

1、启动服务器基本步骤

2、端口不能重复使用

端口号如果已经被占用,则会启动失败
浏览器默认端口为80端口
3、默认端口号80验证

如果端口号是80,则输入url时只输入localhost或者127.0.0.1也可以访问
4、响应编写与结束简写
发送响应数据同时,结束响应

5、根据不同请求路径,发送不同结果
判断分析:所有请求路径以/开头

浏览器默认行为:访问网页图标


6、商品接口模拟

注意:编写好商品数据后,无法直接编写响应数据返回给客户端,需要注意数据类型

验证后发现只能接收字符串和二进制数据,即响应内容数据类型限制。

结果:

验证后发现和之前所接触的接口十分相似,简单了解下... ...,这里中文乱码,后续介绍,当然开发时数据都是存储在数据库
(10)Node.js中的js---核心模块

1、node中JS支持ES,没有BOM与DOM
2、核心模块
例如:
fs(file system)文件系统模块
os(operation system)操作系统信息模块
http服务构建模块
path路径操作模块
os案例:


上面四个对象为四核
3、获取内存totalmem
/*获取内存大小,memory内存,单位为字节*/ var totalmem = os.totalmem(); console.log(totalmem)

4、path模块处理路径,获取扩展名extname
var path = require('path'); /*获取扩展名:extension name*/ var extname = path.extname('c:/user/myblog.txt'); console.log(extname)

5、多脚本文件并发执行
普通编写的话:node下同一时间只能读取操作一个脚本文件,如下所示

如果想同时执行多个脚本,需要模块化编程
6、模块化编程

正如之前验证,两个脚本无法同时执行,所以只能通过代码,在执行a.js同时执行脚本文件b.js
node里,可以通过require加载的模块有3种 1、具名核心模块fs、http、path、os 2、用户自定义的模块(相对路径必须加./) 3、

验证如下:


同理,再添加个c.js

验证如下

先进后出,后进先出
7、模块作用域
在node里,没有全局作用域,只有模块作用域,外部访问不到内部,内部也访问不到外部

验证如下:

小结:

注意: 1、后缀名可以省略
2、相对路径的./不能省略,否则会报错(去掉会将其作为核心模块与识别解析)



8、模块通信

9、模块的导入加载与导出
首先测试下直接读取别的模块信息


读取失败
接下来试下模块化信息操作,即模块导入与导出

每个文件模块都提供了一个对象:exports,默认exports是一个空对象

对象是动态的,所以如果想在其他模块使用该模块的数据,需要将其挂载到exports对象上,即动态添加成员

此时结果为{foo:hello}

也可以导出方法


思考:

这里的两个add并不一样,一个是模块里的函数,另一个是挂载到exports对象上的方法
注意:只要是没有挂载到exports对象上的数据或方法,在另一个模块里都获取不到


修改如下:

10、模拟核心模块封装

(11)ip地址&&端口号介绍
1、ip与端口号
ip用来定位计算机
端口号用来定位应用程序


小结:


2、端口号补充

范围:0-65535
网站上线部署时用80默认端口即可
开发阶段推荐用3000、5000没有实际含义的端口号即可
(12)响应内容类型Content-type
1、中文乱码问题
首先编写http服务模块基本框架

可以同时开启多个服务,但要确保不同服务占用不同的端口号

加上中文,再次验证如下


乱码原因剖析:之所以乱码,是因为服务器发送的数据为utf-8编码即国标编码,但浏览器不知道。
浏览器在不知道服务器响应内容的编码情况下,会按照当前系统的默认编码去解析(中文操作系统默认gbk编码)
2、解决方法,声明编码协议类型

案例如下:

乱码与设置响应头格式对比:


3、除了普通文本text/plain,还有其他格式,例如百度

4、Content-Type作用
在http协议里,Content-Type作用为设定信息类型
代码如下所示

案例根据不同Content-Type返回不同类型,如下所示


如果Content-Type为html,浏览器会将其进行解析;如果是普通文本,则会将其解析为普通字符串文
5、发送文件中的数据及Content-Type内容类型
打开百度审查,即可得知,请求页面时,本质获取的是字符串,但为html内容字符串。然后浏览器对其进行解析渲染

6、测试
首先在文件夹下存放不同类型的资源文件

需求:请求路径不同,访问不同的资源文件
①首先读取html文件

详细设置

接下来修改HTML文件内容,再次刷新页面,这里注意:不用重启服务器
这里之所以不用重启服务器,因为js脚本文件并未更新,每次只是重新读取html文件,所以这里直接刷新后会重新读取
②读取图片
这里拓展对照表


查找图片对应Content-Type类型

③统一资源定位符

④小结

(13)总结



接口对象:

核心模块:

http网络服务构建模块:

框架:

目前为止的一些操作,都是原生语法操作,例如http网络服务模块相关操作比较繁琐;所以后期学习express简化操作;所以这里会先使用原生,后用express框架
类似于JS操作DOM,后续学习jQuery简化DOM操作语法
.

浙公网安备 33010602011771号