Express 简介
通俗的理解: Express 的作用和 Nodejs 内置的 http 模块类似,是专门用来创建 Web 服务器的.
Express 的本质:就是一个npm 上的第三方包,提供了快速创建 Web 服务器的便捷方法
有了 http 内置模块,为什么还有用 Express
htp 内置模块用起来很复杂,开发效率低,Express 是基于内置的 http 模块进一步封装出来的,能够极大的提高开发效率
Express 能做什么
1. Web 网站服务器: 专门对外提供 Web 网页资源的服务器
2. API 接口服务器:专门对外提供 API 接口的服务器
使用 Express,我们可以方便、快速的创建 Web 网站的服务器或 API 接口的服务器
获取URL中的动态参数: app.get( ' /user/:d' , (req, res) => {})
创建一个静态资源目录: app.use("路由",express.static("资源路径") )
nodemon自动重启
将 node 命令替换为 nodemon 命令,使用 nodemon app.js 来启动项目。
好处:代码被修改之后,会被 nodemon 监听到,从而实现自动重启项目的效果。
Express 中的路由: 3 部分组成,分别是请求的类型、请求的 URL 地址、处理函数
模块化路由
1. 创建路由模块对应的js 文件
2. 调用 express.Router() 函数创建路由对象
3. 向路由对象上挂载具体的路由
4. 使用 module.exports 向外共享路由对象
5. 使用app.use()函数注册路由模块
app.use() 函数的作用,就是来注册全局中间件
Express 中间件的调用流程: 当一个请求到达Express的服务器之后,可以连续调用多个中间件,从而对这次请求进行预处理。
Express 中间件的格式: 中间件函数的形参列表中,必须包含 next 参数。而路由处理函数中只包含 req 和res
next函数的作用
next 函数是实现多个中间件连续调用的关键,它表示把流转关系转交给下一个中间件或路由
全局生效的中间件
客户端发起的任何请求,到达服务器之后,都会触发的中间件,叫做全局生效的中间件.通过调用 app.use(中间件函数),即可定义一个全局生效的中间件
中间件的作用
多个中间件之间,共享同一份 req 和 res。基于这样的特性,我们可以在上游的中间件中,统一为 req 或 res 对象添加自定义的属性或方法,供下游的中间件或路由进行使用。
局部生效的中间件
不使用 app.use()定义的中间件,叫做局部生效的中间件
中间件的5个使用注意事项
1. 一定要在路由之前注册中间件
2. 客户端发送过来的请求,可以连续调用多个中间件进行处理
3. 执行完中间件的业务代码之后,不要忘记调用 next0 函数
4.为了防止代码逻辑混乱,调用 next0 函后不要再写额外的代码
5. 连续调用多个中间件时,多个中间件之间,共享 req 和 res 对象
中间件的分类
1. 应用级别的中间件
2. 路由级别的中间件
3. 错误级别的中间件(除了错误的中间件放到所有路由之后,其他的都放到路由之前)
4. Express 内置的中间件 (static, json,urlencoded,)
5. 第三方的中间件
第三方的中间件
1. 运行 npm install 中间件
2. 使用 require 导入中间件
3. 调用 app.use()注册并使用中间件
监听req的data事件
req.on('data',(a)=>{})
req.on('end',(a)=>{})
接口的跨域问题
1. CORS (主流的解决方案,推荐使用)
2. JSONP (有缺陷的解决方案: 只支持 GET 请求)
简单请求和预检请求的区别
简单请求的特点: 客户端与服务器之间只会发生一次请求。
预检请求的特点: 客户端与服务器之间会发生两次请求,OPTION 预检请求成功之后,才会发起真正的请求
服务端染的 Web 开发模式
服务端渲染的概念:服务器发送给客户端的 HTML 页面,是在服务器通过字符串的拼接,动态生成的。因此,客户端不需要使用 Ajax这样的技术额外请求页面的数据。
优点:
1. 前端耗时少。因为服务器端负责动态生成 HTML 内容,浏览器只需要直接染页面即可。尤其是移动端,更省电。
2. 有利于SEO。因为服务器端响应的是完整的 HTML 页面内容,所以爬虫更容易爬取获得信息,更有利于 SEO。
缺点:
1. 占用服务器端资源。即服务器端完成 HTML页面内容的拼接,如果请求较多,会对服务器造成一定的访问压力。不利于前后端分离,开发效率低。
2. 使用服务器端渲染,则无法进行分工合作,尤其对于前端复杂度高的项目,不利于项目高效开发。
前后端分离开发模式
优点:
1. 开发体验好。前端专注于 UI页面的开发,后端专注于api 的开发,且前端有更多的选择性。用户体验好。Ajax 技术的广泛应用,极大的提高了用户的体验,可以轻松实现页面的局部刷新2. 减轻了服务器端的渲染压力。因为页面最终是在每个用户的浏览器中生成的。
缺点:
1. 不利于 SEO。因为完整的 HTML 页面需要在客户端动态拼接完成,所以爬虫对无法爬取页面的有效信息。(解决方1案:利用VueReact等前端框架的 SSR (server side render)技术能够很好的解决 SEO 问题!)
身份认证
1. 服务端渲染推荐使用 Session 认证机制
2. 前后端分离推荐使用 JWT 认证机制
什么是 Cookie(用于验证用户身份)
Cookie 是存储在用户浏览器中的一段不超过 4 KB 的字符串。它由一个名称(Name)、一个值(Value) 和其它几个用于控制 Cookie 有效期、安全性、使用范围的可选属性组成。
不同域名下的 Cookie 各自独立,每当客户端发起请求时,会自动把当前域名下所有未过期的 Cookie 一同发送到服务器。
Cookie的几大特性:
1. 自动发送
2. 域名独立
3. 过期时限
4. 4KB 限制
Cookie 不具有安全性
由于 Cookie 是存储在浏览器中的,而且浏览器也提供了读写 Cookie 的 API,因此 Cookie 很容易被伪造,不具有安全性。因此不建议服务器将重要的隐私数据,通过 Cookie 的形式发送给浏览器。
Session 认证机制局限性
Session 认证机制需要配合 Cookie 才能实现。由于 Cookie 默认不支持跨域访问,所以,当涉及到前端跨城请求后端接口的时候,需要做很多额外的配置,才能实现跨域 Session 认证。
注意:
1. 当前端请求后端接口不存在跨域问题的时候,推荐使用 Session 身份认证机制
2. 当前端需要跨域请求后端接口的时候,不推荐使用 Session 身份认证机制,推荐使用JWT 认证机制
JWT 由三部分组成: Header (头部)、Payload (有效荷载)、Signature (签名)。三者之间便用英文的“”分隔,格式如下: