Node.js学习分享(下)

诗林  金牌会员 | 2025-3-13 19:12:32 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 690|帖子 690|积分 2070

Express

express的根本用法

创建根本的web服务器

  1. const express = require('express') //导入express模块
  2. //创建服务器
  3. const app = express()
  4. //启动web服务器
  5. app.listen(80,()=>{
  6.     console.log('express server running at http://127.0.0.1');
  7. })
复制代码
监听GET请求



  • 通过app.get()方法,可以监听客户端的GET请求
  • 语法格式:
  1. app.get("请求URL",(req,res)=>{})
复制代码
监听POST请求



  • 通过app.post()方法,可以监听客户端的POST请求
  • 语法格式:
  1. app.post("请求URL",(req,res)=>{})
复制代码
把内容响应给客户端



  • 通过res.send()方法,可以把处理好的内容发送给客户端
    //使用res.send()方法,向客户端响应一个JSON对象
  1. app.get('/user',(req,res)=>{
  2.     res.send({name:"zhengbo",age:19,hobby:"badminton"})
  3. })
复制代码
获取URL中携带的查询参数



  • 通过req.query对象,可以访问到客户端通过查询字符串的情势,发送到服务器的参数
获取URL中的动态参数



  • 通过req.params对象,可以访问到URL中,通过:匹配到的动态参数
托管静态资源

express.static()



  • 通过express.static(),我们可以非常方便地创建一个静态资源管理器
  1. app.use(express.static("文件名"))
复制代码
托管多个静态资源目录



  • 多次调用express.static()函数
挂载路径前缀



  • 假如盼望在托管的静态资源路径之前,挂载路径前缀,可以使用下面的方式
  1. app.use('路径前缀',express.static('文件名'))
复制代码
Express路由



  • 广义上来讲,路由就是映射关系
  • 在express中,路由指的是客户端请求与服务器处理函数之间的映射关系
  • express中路由分为三部分:

    • 请求的类型
    • 请求的URL地址
    • 处理函数
      app.method(“path”,“Handler”)
      路由的使用

  • 在express中使用路由最简单的方法,就是把路由挂载到app上
  1. const express = require('express')
  2. const app = express()
  3. //挂载路由
  4. app.get('/',(req,res)=>{
  5.     res.send('Hello,World!')
  6. })
  7. app.listen(80,()=>{
  8.     console.log("server running at http://127.0.0.1");
  9. })
复制代码
路由模块化


  • 创建路由模块对应的js文件
  • 调用express.Router()函数创建路由对象
  • 向路由对象上挂载详细的路由
  • 使用module_exports向外共享路由对象
  • 使用app.use()函数注册路由模块
    app.use()函数的作用,就是来注册全局中间件
Express中间件

Express中间件的调用流程



  • 当一个请求到达Express服务器之后,可以连续调用多个中间件,从而对这次请求进行预处理
Express中间件的格式



  • Express的中间件,本质上就是一个function处理函数。
  • 注意:中间件函数的形参列表中,必须包含next参数。而路由处理函数中只包含req和res
next函数的作用



  • next函数是实现多个中间件连续调用的关键,它体现把流转关系转交给下一个中间件或路由
    定义一个最简单的中间件函数
    //定义一个中间件函数
    const middleFun = (req,res,next)=>{
    console.log(“这是一个中间件函数”);
    //把流转关系,转交给下一个中间件大概路由
    next()
    }
全局见效的中间件



  • 客户端发起的任何请求,到达服务器之后,都会触发的中间件,叫做全局见效的中间件
  • 通过调用app.use(中间件函数),即可定义一个全局见效的中间件
  1. //全局生效的中间件
  2. app.use(middleFun)
复制代码
中间件的作用



  • 多个中间件之间,共享同一份req和res。基于如许的特性,我们可以在上游的中间件中,同一为req和res对象添加自定义的属性和方法,供卑鄙的中间件大概路由进行使用
  1. //全局生效的中间件
  2. app.use((req,res,next)=>{
  3.     const time = Date.now()
  4.     req.startTime = time
  5.     next()
  6. })
复制代码
局部见效的中间件



  • 不使用app.use()定义的中间件,叫做局部见效的中间件
  • 在路由参数URL和Handler中间加上该中间件函数即可局部见效
中间件的注意事项


  • 一定要在路由之前注册中间件
  • 客户端发送过来的请求,可以连续调用多个中间件进行处理
  • 执行完中间件的业务代码之后,不要忘记调用next()函数
  • 为了防止代码逻辑杂乱,调用next函数之后不要再写额外的代码
  • 连续调用多个中间件时,多个中间件之间,共享req和res对象
中间件的分类

应用级别的中间件



  • 通过app.use()大概app.get()等,绑定到app实例上的中间件,叫做应用级别的中间件
    路由级别的中间件
  • 绑定到express.Router()实例上的中间件,叫做路由级别的中间件
错误级别的中间件



  • 作用:专门用来捕捉整个项目中发生的非常错误,从而防止项目非常崩溃的问题
  • 必须有四个形参,分别是(err,req,res,next)
    注意:错误级别的中间件,必须注册在所有路由之后
    Express内置的中间件
  • express.static()
  • express.json剖析JSON格式的请求体数据(有兼容性)
  • express.urlencoded剖析URL-encoded格式的请求体数据(有兼容性)
第三方中间件


  • 安装中间件:npm install + 中间件
  • 使用require导入中间件
  • 调用app.use注册并使用中间件
    注意:假如没有配置任何的剖析表单数据的中间件,则req.body默以为undefined
自定义中间件



  • 手动模拟一个类似于express.urlencoded如许的中间件,来剖析POST提交到服务器的
  • 实现步骤:

  • 定义中间件
  • 监听req的data事件
  • 监听req的end事件
  • 使用querystring模块剖析请求体数据
  • 将剖析出来的数据挂载为req.body
  • 将自定义中间件封装为模块
  1. const express = require('express')
  2. const app = express()
  3. const qs = require('querystring')
  4. //解析表单数据的中间件
  5. app.use((req,res,next)=>{
  6.     //定义一个字符串,专门存储客户端发送过来的请求体数据
  7.     let str = ''
  8.     //监听req的data事件
  9.     req.on('data',(chunk)=>{
  10.         str+=chunk
  11.     })
  12.     //监听req的end事件
  13.     req.on('end',()=>{
  14.         //将字符串解析为对象格式
  15.         const body = qs.parse(str)
  16.         req.body = body
  17.          next()
  18.     })
  19.    
  20. })
  21. //在POST请求接口中返回上面中间件挂载到req.body的数据
  22. app.post('/user',(req,res)=>{
  23.     res.send(req.body)
  24. })
  25. app.listen(80,()=>{
  26.     console.log('server running at http://127.0.0.1');
  27. })
复制代码
使用Express写接口

编写GET接口

  1. //GET接口
  2. apirouter.get('/get',(req,res)=>{
  3.     //获取客户端通过查询字符串发送到服务器的数据
  4.     const query = req.query
  5.     //向客户端响应数据
  6.     res.send({
  7.         status:0,
  8.         msg:'GET请求成功',
  9.         data:query
  10.     })
  11. })
复制代码
编写POST接口

  1. //POST接口
  2. apirouter.post('/post',(req,res)=>{
  3.     const body = req.body
  4.     res.send({
  5.         status:0,
  6.         msg:'POST请求成功',
  7.         data:body
  8.     })
  9. })
复制代码
CORS跨域资源共享

解决跨域问题的两种方案


  • CORS:主流的解决方案,保举使用
  • JSONP:有缺陷,只支持GET请求
cors中间件解决跨域问题



  • cors是Express的一个第三方中间件,通过它可以很方便的解决跨域问题
    使用步骤:
    1. npm install cors

  • const cors = require("cors"),导入中间件
  • 在路由之前调用app.use(cors())配置中间件
什么是CORS



  • CORS(跨域资源共享)由一系列http响应头构成,这些http响应头决定浏览器是否构造前端JS代码跨域获取资源
  • 浏览器的同源安全策略默认会制止网页跨域得到资源。但假如接口服务器配置了CORS相干的http响应头,就可以解决浏览器端的跨域访问限定
CORS响应头部



  • Access-Control-Allow-Origin: <origin> | *
  • origin参数的值指定了允许访问该资源的外域URL
  • Access-Control-Allow-Headers
  • 假如客户端向服务端发送了额外的请求头,则必要通过该请求头对额外的请求头进行声明
  • Access-Control-Allow-Methods
  • 默认环境下,CORS仅支持客户端发起GET、POST、Head请求
  • 假如必要别的请求方式,则必要通过该请求头来指明实际请求所允许使用的http方法
CORS请求的分类



  • 根据请求方式和请求头的不同,可以把CORS请求分为两类
  • 简单请求和预检请求
简单请求



  • 同时满足以下两大条件的请求

  • 请求方式:GET 、POST、HEAD三者之一
  • HTTP 头部信息不超过以下几种字段:无自定义头部宇段、Accept. Accept-Language、Content-Language、DPR、Downlink、 Save-Data, Viewport-Width、Width、Content-Type
预检请求



  • 不是简单请求的请求就是预检请求
    简单请求和预检请求的区别
  • 简单请求特点:客户端与服务器之间只会发生一次请求
  • 预检请求特点:客户端与服务器之间会发生两次请求,OPTION预检请求乐成之后,才会发起真正的请求
web开发模式

服务端渲染的web开发模式



  • 服务器发送给客户端的HTML页面,是在服务器通过字符串的拼接,动态天生的。因此,客户端不必要使用Ajax如许的技能额外请求页面的数据
优缺点:

优点:

  • 前端耗时少
  • 有利于SEO
缺点:

  • 占用服务器端资源
  • 倒霉于前后端分离,开发效率低
前后端分离的web开发模式



  • 后端只负责提供API接口,前端使用Ajax调用接口
优缺点:

优点:

  • 开发体验好
  • 用户体验好
  • 减轻了服务器端的渲染压力
缺点:

  • 倒霉于SEO
session认证机制

http协议的无状态性



  • 指的是客户端的每次http请求都是独立的,连续多个请求之间没有直接的关系,服务器不会自动保留每次http的状态
Cookie

什么是cookie



  • cookie是存储在用户浏览器中的一段不超过4KB的字符串。它由一个名称、一个值和其他几个用于控制cooker有效期、安全性、使用范围的可选属性构成
  • 不同域名下的cookie各自独立,每当客户端发起请求时,会自动把当前域名下所有未逾期的cookie一同发送到服务器
cookie的四大特性


  • 自动发送
  • 域名独立
  • 逾期时限
  • 4KB限定
cookie不具有安全性



  • 由于cookie是存储在浏览器中的,而且浏览器也提供了读写cookie的API,因此cookie很容易被伪造,不具有安全性。因此不建议服务器将紧张的隐私数据,通过cookie的情势发送给浏览器。
session的工作原理


向session中存储数据



  • 当express-session中间件配置乐成后,即可通过req.session来访问和使用session对象,从而存储用户的关键信息
  1. //登录的api接口
  2. app.post('/api/login',(req,res)=>{
  3.     if(req.body.username !== 'admin' || req.body.password !== '000000'){
  4.         return res.send({status:1,msg:'登录失败'})
  5.     }
  6.    
  7.     //将登录成功后的用户信息,存储到session中
  8.     req.session.user = req.body //用户信息
  9.     req.session.islogin = true //用户的登录状态
  10.     res.send({status:0,msg:'登录成功'})
  11. })
复制代码
从session中取数据



  • 可以直接从req.session对象上获取之前存储的数据
  1. //获取用户用户名的接口
  2. app.get('/api/username',(req,res)=>{
  3.     if(!req.session.islogin){
  4.         return res.send({status:1,msg:'fail'})
  5.     }
  6.     res.send({status:0,msg:'success',username:req.session.username})
  7. })
复制代码
清空session



  • 调用req.session.destroy()函数,即可清空服务器保存的session信息
  1. //退出登录的接口
  2. app.post('/api/loginout',(req,res)=>{
  3.     //清空当前客户端对应的session信息
  4.     req.session.destroy()
  5.     res.send({
  6.         status:0,
  7.         msg:'退出登录成功'
  8.     })
  9. })
复制代码
JWT认证机制



  • session认证机制必要配合cookie才能实现,由于cookie默认不支持跨域访问,所以当涉及前端跨域访问后端接口时,所以必要做许多额外的配置,才能实现跨域session认证
  • 当前端请求后端接口不存在跨域问题时,保举使用session身份认证机制
什么是JWT



  • JSON Web Token 是目前最流行的跨域认证解决方案
    JWT的工作机制

  • 用户的信息通过token字符串的情势,保存在客户端浏览器中。服务器通过还原token字符串的情势来认证用户的身份
JWT的构成



  • JWT通常由三部分构成,分别是Header(头部),Payload(有效荷载),Signature(签名)
  • Payload部分才是真正的用户信息,它是用户信息颠末加密之后天生的字符串
  • Header和Signature是安全性相干的部分,只是为了包管token的安全性
JWT的使用方式



  • 保举的做法是把JWT放在HTTP请求头的Authorization字段中
在Express中使用JWT

安装JWT相干的包

npm install jsonwebtoken express-jwt


  • jsonwebtoken:用于天生JWT字符串
  • Express-jwt:用于将JWT字符串剖析还原成JSON对象
    导入包
  • 使用require函数
    const jwt = require(‘jsonwebtoken’)
    const expressJWT = require(‘express-jwt’)
    定义secret密钥
  • 包管JWT字符串的安全性
    const secretKey = ‘yaoyao No1’
    再登录乐成后天生JWT字符串
  • 调用jsonwebtoken包提供的sign()方法,将用户的信息加密成JWT字符串,响应给客户端
将JWT字符串还原为JSON对象



  • 服务器可以通过express-jwt这个中间件,自动将客户端发送过来的token剖析成JSON对象

   注意:只要配置好了express-jwt这个中间件,就可以把剖析出来的用户信息,挂载到req.user属性上

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

诗林

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表