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

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 中间件(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
目录
相关文章
|
2月前
|
中间件
|
2月前
|
存储 JavaScript 前端开发
❤Nodejs 第十四章(node中间件multer的认识安装使用)
【4月更文挑战第14天】Multer是Node.js用于处理multipart/form-data的中间件,专注于文件上传。。基本用法包括设置存储引擎,如磁盘存储(DiskStorage)或内存存储(MemoryStorage),并指定处理单个或多个文件的方法。例如,`multer.single(&#39;file&#39;)`处理单个文件上传。存储引擎DiskStorage适合永久保存,而MemoryStorage适合临时处理。可以通过`limits`选项限制文件大小,实现不同类型的文件有不同的大小限制。
108 0
|
2月前
|
开发框架 JavaScript 中间件
深入探索Node.js的Express框架:使用与中间件详解
【4月更文挑战第30天】本文深入探讨了Node.js的Express框架,介绍了其作为Web开发的强大工具,主要聚焦于基本使用和中间件。Express是基于Node.js的Web应用框架,用于构建高效的应用和API。文章详细讲解了如何安装Express,创建简单应用,以及中间件的工作原理和应用,包括中间件的顺序、错误处理和挂载位置。此外,还提到了使用第三方中间件扩展功能。理解Express基础和中间件对于开发高质量Web应用至关重要。
|
2月前
|
中间件
node使用multer进行文件上传
node使用multer进行文件上传
|
2月前
|
前端开发
node+express+ multer 实现文件上传入门
node+express+ multer 实现文件上传入门
|
2月前
|
JavaScript 前端开发 中间件
Node.js—Express使用、Express 路由 、Express 中间件、托管静态资源、使用 Express 写接口、node.js链接sqlite数据库
Node.js—Express使用、Express 路由 、Express 中间件、托管静态资源、使用 Express 写接口、node.js链接sqlite数据库
153 0
|
10月前
|
NoSQL 前端开发 JavaScript
node连接mongodb,ejs,cookie基础使用
node连接mongodb,ejs,cookie基础使用
|
29天前
|
消息中间件 存储 NoSQL
阿里开源中间件一览
阿里开源中间件一览
33 2
|
2月前
|
算法 NoSQL Java
2023年阿里高频Java面试题:分布式+中间件+高并发+算法+数据库
又到了一年一度的金九银十,互联网行业竞争是一年比一年严峻,作为工程师的我们唯有不停地学习,不断的提升自己才能保证自己的核心竞争力从而拿到更好的薪水,进入心仪的企业(阿里、字节、美团、腾讯.....)
|
11月前
|
NoSQL Java Redis
阿里Java高级岗中间件二面:GC+IO+JVM+多线程+Redis+数据库+源码
虽然“钱多、事少、离家近”的工作可能离技术人比较远,但是找到一份合适的工作,其实并不像想象中那么难。但是,有些技术人确实是认真努力工作,但在面试时表现出的能力水平却不足以通过面试,或拿到高薪,其实不外乎以下 2 个原因: