Node(二)——中间件,Cookie,multer

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
性能测试 PTS,5000VUM额度
简介: 中间件(Middleware) 是一个函数,它可以访问请求对象(request object (req)),响应对象(responseobject (res)), 和 web 应用中处于请求-响应循环流程中的中间件,一般被命名为 next 的变量。🧨中间件的功能:执行任何代码。修改请求和响应对象。终结请求-响应循环。调用堆栈中的下一个中间件。
接上篇

五、express中间件

中间件(Middleware) 是一个函数,它可以访问请求对象(request object (req)),响应对象(response
object (res)), 和 web 应用中处于请求-响应循环流程中的中间件,一般被命名为 next 的变量。

🧨中间件的功能:

  • 执行任何代码。
  • 修改请求和响应对象。
  • 终结请求-响应循环。
  • 调用堆栈中的下一个中间件。

(1)应用级中间件

//  应用级中间件(用于权限判断 )
app.use((req,res,next)=>{
    console.log(new Date());
    // console.log("")
    next() //如果想继续向下执行app...,就需要写next()
})

(2)内置中间件

可以配置静态服务目录

//静态服务

app.use("/static",express.sat

(3)第三方中间件

body-parser 中间件 第三方 获取post提交数据

cnpm i body-parser --save

var bodyParser=require("body-parser")

设置中间件

//处理form表单的中间件

app.use(bodyParser.urlencoded({extended:false})); 
//form表单提交的数据

(4)路由级中间件

// 路由级中间件(用的比较少)
app.get("/news/add",(req,res,next)=>{
    // res.send("执行增加新闻")
    console.log("执行增加新闻")
    next()

})

(5)错误中间件

// 3.错误中间件
app.use((req,res,next)=>{
   res.status(404).send("404")
})

六、Cookie

(1)概念

cookie是存储于访问者的计算机中的变量,可以让我们用同一个浏览器访问同一个域名的时候共享数据

也可以把上次输入的用户名保存,在下次打开该页面是会直接输入框中

就像京东没有登陆时,也可以把商品添加到购物车,而这添加就被保存在cookie里

(2)使用

在这里插入图片描述

✨✨✨

属性 描述
domain 域名name =value 键值对,可以设置要保存的key/value ,注意这里的name不能和其他属性项的名字一样
Expires 过期时间(秒),在设置的某个时间点后该Cookie 就会失效
maxAge 最大失效时间(毫秒),设置在多少后失效
secure 当secure值为true时,cookie 在HTTP中是无效的,在HTTPS中才有效的
Path 表示cookie影响到的路径,如path=/ ,如果路径不能匹配时,浏览器则不能发送COOKIE
httpOnly 是微商对COOKIE做的扩展,如果在COOKIE中设置了“httpOnly”属性,则通过程序(JS脚本)将无法读取到COOKIE信息,防止攻击XXS攻击产生
signed 表示是否签名cookie,设为true会对这个cookie签名,这样就需要用res.signedCookies而不是res.cookies访问它,被篡改的签名cookie会被服务器被拒绝,并且cookie值会重置为它的原始值

七、express session的基本使用

(1)简单介绍

session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而session保存在服务器上

(2)session的工作流程

当浏览器访问服务器并发送第一次请求时,服务器会创建一个session对象,生成一个类似于key,value的键值对,然后key(cookie) 返回到浏览器端,浏览器下次在访问时,携带key(cookie),找到相对应的session(value)

(3)express-session的使用

//安装
cnpm i express-session --save
//引入express-session
var session=require("express-session")
//设置官方文档提供的中间件
app.use(session({
secret:"keyboard cat",
resave:true,
saveUninitialized:true
}))
//使用
设置值 req.session.username="张三"
获取值 req.session.username

(4)负载均衡配置session,把session信息保存到数据库里面

在这里插入图片描述
我们可以把数据存储在数据库里面。

https://www.npmjs.com/package/connect-mongo

 store: MongoStore.create({
    mongoUrl: 'mongodb://user12345:foobar@localhost/test-app?authSource=admin&w=1',
    mongoOptions: advancedOptions // See below for details
  }

现如今connect-mongo以及更新了,如上所示

(5)把session信息保存在redis里面

https://www.npmjs.com/package/connect-redis

npm install redis connect-redis express-session

也可以保存在MySQL里面

https://www.npmjs.com/package/connect-mysql

八、multer上传图片

(1)模块介绍

Multer 是一个node.js中间件,用于处理表单数据,它主要用于上传文件,它是在busboy之上非常高效

注意:Multer 不会处理任何非multipart/form-date类型的表单数据

(2)使用

安装:npm install --save multer

在这里插入图片描述

(3)express上传文件模块multer的使用

要上传图片的话必须在form表单里添加

<form action="/profile" method="post" enctype="multipart/form-data">
  <input type="file" name="avatar" />
</form>

(4)指定图片文件名的方法

//-------------------------------
//-------------------
const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, '/tmp/my-uploads')
  },
  filename: function (req, file, cb) {
    const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9)
    cb(null, file.fieldname + '-' + uniqueSuffix)
  }
})

const upload = multer({ storage: storage })

(5)express按照日期生成上传文件目录,也可以上传文件

在这里插入图片描述

https://www.npmjs.com/package/silly-datetime

npm i silly-datetime --save

创建目录 npm i mkdirp --save

(6)上传多个文件

在这里插入图片描述


const multer = require("multer")
const path = require("path")
const sd=require("silly-datetime")
const mkdirp=require("mkdirp")
let tools = {
  multer() {
    // 配置上传目录
    const storage = multer.diskStorage({
      destination: async (req, file, cb) =>{
        // 1.获取当前日期
        let day=sd.format(new Date(),"YYYYMMDD")
        
        let dir=path.join("static/upload",day)
        // 按照日期生产图片存储目录
       await mkdirp(dir)   //要等待dirp上传完毕,再执行下一行,这是一个异步方法
        cb(null, dir)  ///上传之前目录必须存在
      },
      // 修改上传后的文件名
      filename: function (req, file, cb) {
        // 1.获取后缀名
        let extname = path.extname(file.originalname)
        // 2.根据时间戳生成文件名
        //   const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9)
        //   cb(null, file.fieldname + '-' + uniqueSuffix)
        cb(null, Date.now() + "." + extname)
      }
    })
    const upload = multer({ storage: storage })
      return upload
  }
}
module.exports=tools
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
1月前
|
JavaScript 安全 中间件
深入浅出Node.js中间件机制
【10月更文挑战第36天】在探索Node.js的奥秘之旅中,中间件的概念如同魔法一般,它让复杂的请求处理变得优雅而高效。本文将带你领略这一机制的魅力,从概念到实践,一步步揭示如何利用中间件简化和增强你的应用。
|
1月前
|
消息中间件 JavaScript 中间件
深入浅出Node.js中间件机制
【10月更文挑战第24天】在Node.js的世界里,中间件如同厨房中的调料,为后端服务增添风味。本文将带你走进Node.js的中间件机制,从基础概念到实际应用,一探究竟。通过生动的比喻和直观的代码示例,我们将一起解锁中间件的奥秘,让你轻松成为后端料理高手。
36 1
|
28天前
|
Web App开发 JSON JavaScript
Node.js 中的中间件机制与 Express 应用
Node.js 中的中间件机制与 Express 应用
|
2月前
|
JSON JavaScript 中间件
深入浅出Node.js中间件机制
本文将带你探索Node.js中一个核心概念——中间件机制。我们将通过浅显的语言和生动的比喻,揭示中间件如何作为请求和响应之间的“交通枢纽”,在应用程序中起到至关重要的作用。从基础原理到实际应用,你将了解到中间件不仅简化了代码结构,还提高了开发效率,是Node.js开发不可或缺的一部分。
59 1
|
2月前
|
JavaScript 安全 中间件
深入浅出Node.js中间件机制
【10月更文挑战第4天】在探索Node.js的海洋中,中间件机制犹如一座灯塔,为开发者指引方向。本文将带你一探究竟,从浅入深地理解这一核心概念。我们将通过生动的比喻和实际代码示例,揭示中间件如何在请求和响应之间搭建桥梁,实现功能的扩展与定制。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和深入的理解。
61 0
|
7月前
|
消息中间件 存储 负载均衡
消息中间件的选择:RabbitMQ是一个明智的选择
消息中间件的选择:RabbitMQ是一个明智的选择
120 0
|
6月前
|
消息中间件 存储 中间件
【消息中间件】详解三大MQ:RabbitMQ、RocketMQ、Kafka
【消息中间件】详解三大MQ:RabbitMQ、RocketMQ、Kafka
1677 0
|
5月前
|
消息中间件 编解码 Docker
Docker部署RabbitMQ消息中间件
【7月更文挑战第4天】Docker部署RabbitMQ消息中间件
283 3
|
2月前
|
消息中间件 编解码 Docker
【Docker项目实战】Docker部署RabbitMQ消息中间件
【10月更文挑战第8天】Docker部署RabbitMQ消息中间件
124 1
【Docker项目实战】Docker部署RabbitMQ消息中间件
|
4月前
|
消息中间件 Java 测试技术
消息中间件RabbitMQ---SpringBoot整合RabbitMQ【三】
这篇文章是关于如何在SpringBoot应用中整合RabbitMQ的消息中间件。内容包括了在SpringBoot项目中添加RabbitMQ的依赖、配置文件设置、启动类注解,以及如何通过单元测试来创建交换器、队列、绑定,并发送和接收消息。文章还介绍了如何配置消息转换器以支持对象的序列化和反序列化,以及如何使用注解`@RabbitListener`来接收消息。
消息中间件RabbitMQ---SpringBoot整合RabbitMQ【三】