一、什么是node
node是基于v8引擎主要用于创建服务器但不限于此,是开源和跨平台的javascript运行时环境。
(前端的js运行的环境是浏览器,后端的js运行的环境是node)
二、一些快捷键
1.windows+R=打开cmd
2.shift+鼠标右键=打开powershell
3.关于命令行的
- 上箭头=>上次执行的命令
- tab=>文件的快速补全
- esc=>清空命令行
- cls/clear=>清空终端
三、关于路径的一些语法
1.__dirname=>当前文件所处目录
2.path.jion()=>路径拼接
假如拼接的路径字符串中有../,那么../前面的那一层就会被抵消,有几个就抵消几层。
eg:path.jion(__dirname,'/a','/b','../','/c')=>xxx/a/c
那么b这一层目录就被抵消了
3.path.basename(path,[扩展名])=>获取文件名
假如扩展名意味着获取得到的文件名没有后缀名
4.path.extname(path)=>获取文件扩展名
四、文件操作(fs)
1.readFild(path,[读取出来的文件格式],回调:(err,dataStr)=>{})
- path要读取的文件路径
- 回调是为了拿到结果。成功时err是null,dataStr是读取到的内容。失败时err是err对象,dataStr是undefine
2.writeFild(path,写入的内容,[写入的格式],回调:(err)=>{})
- 写入的格式默认是utf-8
- 回调:若写入成功,err是null,写入失败则err是err对象
五、http创建基本的web服务器(内置)
1.导入
const http=require('http')
2.创建实例
const seaver=http.createSeaver()
3.绑定request事件,监听事件的请求
seaver.on('request',(req,res)=>{})
- req是与客户相关的数据和属性
- res是响应对象,与服务器相关的数据和属性,可通过res.end()向客户端发送指定内容并结束此次请求。同时为了防止乱码问题,我们需要设置响应头:
res.setHeader('Content-Type',text/html; 内容的编码格式)
4.启动服务器
seaver.listen(端口号(默认是80),()=>{})
六、模块化
- 什么是模块化
把一个大模块拆分成独立并且相互依赖的小模块。模块化提高了代码的复用性和可维护性,还可以按需加载。
-
通过requre()导入模块时,会执行被加载模块里面的代码。
-
model.exports是模块对外的接口,为了书写方便node提供了exports,而exports指向同一个对象,但使用requre()导入模块永远以model.exports指向的对象为准
-
node.js遵循CommonJS模块规范,在每个模块内部,model变量(是一个对象)代表当前模块。
-
模块的加载机制
1.模块在第一次加载后就会被缓存,其后再调用requre()就会优先从缓存中加载,提高了模块加载效率。
2.内置模块的加载优先级最高。
3.使用requre()导入模块时
如果是
自定义模块并且省略扩展名,则会按照以下顺序进行加载:按确切模块名加载-->补全js加载-->补全json加载-->补全node加载-->加载失败如果是
第三方模块且没有'./','../'开头:加载从当前模块的父目录开始,尝试从/node_model文件中加载第三方模块,若没有就再移到上一层父目录,直到文件系统的根目录为止。
4.当目录作为模块标识符传给requre()时,有三种加载方式:
-->查找package.json文件里面的main属性作为requre()加载的入口。
-->若无package.json文件,或者main入口不存在或无法解析,node就会试图加载目录下的index.js文件。
-->以上失败就报错。
七、Express(web开发框架)
1.Express能提高开发效率,是对http原生内置模块的封装。所以在使用express创建web服务器时和http类似(导入,创建实例,启动web服务器等等)
2.nodemon辅助工具,当修改代码时不需要手动关掉然后再重新启动,它会帮我们重启项目。(安装后只需把命令行的node改为nodemon即可)
3.路由:要先导入路由模块然后注册(app.use(router))
4.中间件:处理业务的中间环节,本质上是一个函数,这个函数有个next参数,并且要再最后调用next。多个中间件共享同一份req和res,下游的中间件可以使用上游中间件定义的属性或者方法。
-
通过app.use()注册的中间件是全局中间件,相反不使用app.use()注册的而是直接加入到某一个请求或者路由等其他地方的中间件是局部中间件。
-
中间件的分类
-->应用级别中间件:绑定到app实例上(app.use)
-->路由级别中间件:绑定到路由上(router.use)
-->错误价格中间件:专门用来捕获项目中发生异常错误,从而防止项目异常崩溃的问题,是一个函数,函数有四个形参(例如:app.use(function(err,req,res,next))
-->内置中间件:
· express.static快速托管静态资源,让外界均可以访问,设置之后类似一个小的服务器。
· express.json解析JSON格式的请求数据。
· express.urlencoded:解析URL-encoded格式的请求。
-->第三方中间件:从第三方库导入,在项目中可按需加载,提高开发效率。导入后直接在app.use或者router.use中使用就好。
5.跨域请求(端口号,域名,协议不相同就是跨域)
-
CORS插件实现跨域请求(安装,导入,使用):
它由一些列HTTP响应请求头组成,这些请求响应头决定浏览器是否阻止前端JS代码跨域获取资源。浏览器默认不允许,但是如果接口服务器配置了CORS相关的HTTP响应头,就可以解除浏览器的跨域访问。res.setHeader('Access-Control-Allow-Origin',允许访问该资源的外界URL)
注意:默认情况下,CORS仅支持用户发送如下九个请求头:
Content-Language、DPR、Downlink、Save-Data、Viewport-Width、Width、Content-Type (值仅限于 text/plain、multipart/form-data、 application/x-www-form-urlencoded 三者之一)如果客户端向服务器发送了额外的请求头信息,则需要在服务器端,通过 Access-Control-Allow-Headers 对额外的请求头进行声明,否则这次请求会失败!
默认情况下,CORS 仅支持客户端发起 GET、POST、HEAD 请求。如果客户端希望通过 PUT、DELETE 等方式请求服务器的资源,则需要在服务器端,通过 Access-Con trol-Allow-Methods来指明实际请求所允许使用的 HTTP 方法。
-
JSONP
概念:浏览器端通过 script 标签的 src 属性,请求服务器上的数据,同时,服务器返回一个函数的调用。这种请求数据的方式叫做 JSONP。
特点: JSONP 不属于真正的Ajax 请求,因为它没有使用 XMLHttpRequest 这个对象。) JSONP 仅支持 GET 请求,不支持 POST、PUT、DELETE 等请求。
如果项目中已经配置了 CORS 跨域资源共享,为了防止冲突,必须在配置 CORS 中间件之前声明JSONP 的接口。否则JSONP 接口会被处理成开启了 CORS的接口。
-
简单请求与预检请求
区别
简单请求的特点:客户端与服务器之间只会发生—次请求,
预检请求的特点:客户端与服务器之间会发生两次请求,OPTION 预检请求成功之后,才会发起真正的请求。只要符合以下任何一个条件的请求,都需要进行预检请求:
-->请求方式为 GET、POST、HEAD 之外的请求 Method 类型
-->请求头中包含自定义头部字段向服务器发送了 application/json 格式的数据
八、数据库
1.数据库是用来组织,贮存,管理数据的仓库。
2.在实际项目开发公,一般情况下,每个项目都对应独立的数据库。不同的数据,要存储到数据库的不同表中,例如:用户数据存储到 users 表中,图书数据存储到 books表中。每个表中具体存储哪些信息,由字段来决定,例如:我们可以为 users 表设计 id、username、password这3个字段。表中的行,代表每一条具体的数据。
九、Web开发模式
1.目前主流的 Web 开发模式有两种,分别是:基于服务端這染的传统 Web 开发模式基于前后端分离的新型 Web 开发模式。
2.服务端渲染的 Web 开发模式
2.1 服务端渲染的概念:服务器发送给客户端的 HTML页面,是在服务器通过字符串的拼接,动态生成的。因此,客户端不需要使用 Ajax这样的技术额外请求页面的数据。
服务端渲染的优缺点 :
优点:
- 前端耗时少。因为服务器端负责动态生成 HTML 内容,浏览器只需要直接渲染页面即可。尤其是移动端,更省电。
- 有利于SEO。因为服务器端响应的是完整的 HTML 页面内容,所以爬虫更容易爬取获得信息,更有利于 SEO.
缺点:
- 占用服务器端资源。即服务器端完成 HTML 页面内容的拼接,如果请求较多,会对服务器造成一定的访问压力。
- 不利于前后端分离,开发效率低。使用服务器端渲染,则无法进行分工合作,尤其对于前端复杂度高的项目,不利于项目高效开发。
2.2前后端分离的Web 开发模式
前后端分离的概念:前后端分离的开发模式,依赖于 Ajax技术的广泛应用。简而言之,前后端分离的 Web 开发模式, 就是后端只负责提供 API 接口,前端使用 Ajax 调用接口的开发模式。
前后端分离的优缺点:
优点:
-
开发体验好。前端专注于 UI 页面的开发,后端专注于api的开发,且前端有更多的选择性。
-
用户体验好。Ajax 技术的广泛应用,极大的提高了用户的体验,可以轻松实现页面的局部刷新。
-
减轻了服务器端的渲染压力。因为页面最终是在每个用户的浏览器中生成的。
缺点:
- 不利于 SEO。因为完整的 HTML 页面需要在客户端动态拼接完成,所以爬虫对无法爬取页面的有效信息。(解决方案:利用 Vé、React等前端框架的SSR(server side render)技术能够很好的解决 SEO 问题!)
十、身份验证
1.不同开发模式下的身份认证
对于服务端渣染和前后端分离这两种开发模式来说,分别有着不同的身份认证方案:
- 服务端渣染推荐使用 Session 认证机城
- 前后端分离推荐使用JWT 认证机制
HTTP 协议的无状态性,指的是客户端的每次 HTTP 请求都是独立的,连续多个请求之间没有直接的关系,服务器不会主动保留每次 HTTP请求的状态。(就像每个消费者去超市买东西一样,收银员不会记住那张面孔的人是会员)
如何突破 HTTP 无状态的限制,在 Web 开发中的专业术语叫做 Cookie(就像消费者手中的vip卡,收银员可以通过这个卡来区分他们和其他消费者)
2.什么是 Cookie
Cookie 是存储在用户浏览器中的一段不超过4 KB的字符串。它由一个名称 (Name)、一个值 (Value) 和其它几个用于控制 Cookie 有效期、安全性、使用范围的可选属性组成。不同域名下的 Cookie 各自独立,每当客户端发起请求时,会自动把当前域名下所有未过期的Cookie 一同发送到服务器。
不同域名下的Cookie 各自独立,每当客户端发起请求时,会自动把当前域名下所有未过期的 Cookie 一同发送到服务器。Cookie的几大特性:
- 自动发送
- 域名独立
- 过期时限
- 4KB 限制
3. Cookie 在身份认证中的作用
客户端第一次请求服务器的时候,服务器通过响应头的形式,向客户端发送一个身份认证的 Cookie,客户端会自动将 Cookie 保存在浏览器中。随后,当客户端浏览器每次请求服务器的时候,浏览器会自动将身份认证相关的 Cookie, 通过请求头的形式发送给服务器,服务器即可验明客户端的身份。
由于 Cookie 是存储在浏览器中的,而且浏览器也提供了读写 Cookie 的API,因此Cookie就很容易被伪造,不具有安全性。因此不建议服务器将重要的隐私数据,通过 Cookie 的形式发送给浏览器。就像会员卡只是看一眼不做任何操作就很容易被人伪造一样。
所以千万不要使用 Cookie 存储重要且隐私的数据!比如用户的身份信息、密码等。
为了防止客户伪造会员卡,收银员在拿到客户出示的会员卡之后,可以在收银机上进行刷卡认证。只有收银机确认存在的会员卡,才能被正常使用。这种“会员卡+刷卡认证”的设计理念,就是 Session 认证机制的精髓。
也就是当浏览器带着Cookie发送网络请求后,服务器根据Cookie找到对应的用户信息,若存在就响应数据给浏览器。
4.JWT
JWT 通常由三部分组成,分别是 Header(头部)、Payload(有效荷载)、Signature(签名),三者之间使用英文的.分隔,格式如下:Header.Payload.Signature。
其中Payload 部分才是真正的用户信息,它是用户信息经过加密之后生成的字符串,Header 和 Signature 是安全性相关的部分只是为了保证 Token 的安全性。
客户端收到服务器返回的JWT 之后,通常会将它储存在 localStorage 或 sessionStorage中. 此后,客户端每次与服务器通信,都要带上这个JWT 的字符串,从而进行身份认证。推荐的做法是把 JWT 放在 HTTP 请求头的Authorization 字段中,格式如下:Authorization: Bearer <token>
服务器通过jsonwebtoken提供的sign()方法用于生成JWT 字符串,通过express-jwt中间件将JWT 字符串解析还原成JSON 对象。
关于项目
1.工具
- 项目中使用的是express,它是对http的封装,用来提高开发效率
- 通过使用mySQL进行对数据库进行操作
1.数据类型: int,varchar(字符串),tinyint()布尔
2.常用字段的标识:
PK:主键,唯一标识
NN:值不允许为空
UQ:值唯一
AI:自动增长
3.常用的SQL语句:
- select * from 表名称 where 列名称 or 运算符
eg:select * from user where id=1 or req.body.username=username
- insert into username (列1,列2...) value (值1,值2...)
- update 表名称 set 列名称=新值, 列名称=新值... where 列名称=指定列的某个值
eg:update user set username=?,password=? where id=?
- delete from 表名称 where 列名称=值
eg:delete from user id=1(删除这一整列)
- select * from user order by ASC(升序)|desc(降序)