目录
从客户端 向 服务器提交文件 是http网页服务器中常见的一种需求
我们在express 可以通过一个第三方中间件 来实现 服务器 接收 客户端提交的文件需求
这个第三方中间件 叫做:formidable
formidable中间件
安装方式
npm i formidable
使用方式
- //1.引入
- let form = require("formidable");
- //2.调用引入的form函数 返回值为 表单接收对象
- let formObj = form({
- encoding:"utf-8",//默认值为utf-8 表示设置提交文件的编码格式
- uploadDir:"路径字符串",//提交文件的存储路径
- keepExtensions:true,//是否保留文件原本的后缀名 默认值为false不保留 设置为true表示保留
- })
- //3.调用formObj表单接收对象 的方法 来接收 客户端表单提交的数据 和 文件
- //这个方法 就是parse
- formObj.parse(req, (err, fields, files) => {
- //req形参 就是 服务器的req形参
- //回调函数中 err接收form表单提交错误的错误信息
- //fields接收form表单提交的数据
- //files接收form表单提交的文件
- //默认接收到的文件 文件名为 随机生成的文件名 因此 我们一般会选择更改文件名
- //我可以使用 fs模块的rename方法 给提交过来的文件 改名
- //用法为:fs.renameSync("旧名","新名")
- })
- //服务器代码
- let express = require("express");
- let formidable = require("formidable");
- let path = require("path");
- let fs = require("fs");
- let app = express();
-
-
- app.post("/index",(req,res)=>{
- //使用这个中间件 接收表单提交数据
- //1.创建表单接收对象
- let form = formidable({
- uploadDir:path.join(__dirname,"upload"),
- keepExtensions:true
- });
- //2.调用parse方法 接收数据
- form.parse(req,(err,fields,files)=>{
- // console.log("错误信息",err)
- // console.log("数据",fields)
- // console.log("文件",files)
- // console.log(files.file)
- fs.renameSync(files.file.filepath,path.join(__dirname,"upload",files.file.originalFilename))
- });
-
- res.send("aaa");
- })
- app.listen(3000);
- html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Documenttitle>
- head>
- <body>
-
- <form action="http://127.0.0.1:3000/index" method="post" enctype="multipart/form-data">
- 用户名:<input type="text" name="un">
- 密码:<input type="text" name="pwd">
- 文件选择:<input type="file" name="file">
- <input type="submit">
- form>
- body>
- html>
我们可以使用一个express的第三方中间件 来生成随机文件名——uuid
下载安装
命令:npm i uuid
使用
- //1.引入
- let {v4} = require("uuid");
- //uuid的入口文件中 暴露的是一个对象 对象中存在一个名为v4 的 函数 使用这个函数 就可以创建随机文件名
- //2.使用v4方法 既可生成随机文件名
- let 变量 = v4()
http是一种互联网传输协议 规定了 互联网上的数据传输规则 为 请求和响应规则
http协议 是一种 无状态协议,也就是说 这种协议下 的网络数据传输 是无法记录状态的
为了解决无法存储状态的问题 提出了两个技术栈——cookie和session
简介
Cookie的产生也是HTTP的特点所决定的。HTTP协议有一个非常重要的特点是无状态的,也就是说当客 户端请求服务器,每一个请求和响应结束以后,这次的连接是马上断开的(也是为了释放资源)。同时 服务器是不保留连接者相关的信息。这就说明了,Cookie要解决HTTP无状态的问题。
应用场景:保存用户信息(保存http状态)
cookie的实现
express中 实现cookie 是通过 cookie-parser 中间件来实现
这是一个第三方中间件 因此我们可以在npm上 了解这个中间件的使用方式
安装中间件
命令:npm install cookie-parser
使用中间件
- let express = require("express");
- let path = require("path");
- let app = express();
- app.use(express.urlencoded({ extended: false }));
- app.use(express.json());
- //处理cookie
- //引入cookie-parser
- let cookieParser = require("cookie-parser");
- //创建中间件函数
- let cookieFn = cookieParser("abcDEF123_%");
- //使用中间件
- app.use(cookieFn);
- //登录逻辑处理中间件
- app.use((req, res, next) => {
- //1.接收登录信息
- let { un, pwd } = req.body;
- //2.判断
- if (un == "狗蛋" && pwd == "gd123") {
- req.flag = "success"
- } else {
- req.flag = "fail"
- }
- next()
- })
- app.get("/login", (req, res) => {
- // res.cookie("flag","success");
- res.sendFile(path.join(__dirname, "login.html"));
- })
- app.post("/login", (req, res) => {
- //1.响应对应的cookie
- res.cookie("flag", req.flag);
- res.send(req.flag);
- //判断如果登录成功 就响应 首页
- // if (req.flag == "success") {
- // res.sendFile(path.join(__dirname, "index.html"));
- // }
- // //否则 还响应 登录页
- // else {
- // res.sendFile(path.join(__dirname, "login.html"));
- // }
- })
- //我们登录成功之后 会跳转到首页 在首页 也应该能拿到登录状态 这才叫 保持住了登录状态
- app.get("/index",(req,res)=>{
- //如果登录成功 就响应登录成功
- //否则响应登录失败
- //我们这里要通过cookie 获取登录状态 来判断
- //cookie中存储的键值对 获取方式为 req.cookies.键名
- if(req.cookies.flag=="success"){
- res.send("登录成功,欢迎您,我的主人")
- }else{
- res.send("快滚,臭猪");
- }
- })
- app.listen(3000);
cookie使用的流程
1.引入cookie-parser
let cookieParser = require("cookie-parser")
2.创建中间件函数
let cookieFn = cookieParser("秘钥字符串",{ maxAge :n})
注意:第二个对象参数 可以不传 如果传 里面可以设置一个属性 maxAge 值为数字 表示cookie的有效期有多长时间 单位为ms 不写单位
3.使用中间件
服务器对象.use(中间件函数)
4.在路由中 设置cookie
res.cookie("键名","键值")
5.后续 就可以在 其他路由中 使用之前路由存储过的cookie了
req.cookies.键名
cookie原理 cookie存储后的执行流程
1.服务器存储cookie
2.cookie会随着服务器的响应 发送给前端浏览器
3.前端浏览器将cookie中保存的键值对 存储在浏览器缓存cookie中
4.后续每次发起请求 浏览器缓存的cookie键值对 都会随着请求报文一起发送到服务器去
5.服务器就可以通过 req.cookies.键名 来接收到 对应的cookie数据
session也是一种用来处理http保存状态 的技术栈
session 是基于 cookie实现的
在express中 我们 使用一个中间件——cookie-session来实现 使用session记录状态
session的原理
不同于cookie 将 状态数据 存储在客户端,session 将状态数据 存储在服务器上 而之后 会给客户端通过cookie发送一个钥匙数据 客户端 可以通过钥匙数据 来证明自己的身份 从而获取session中存储的数据
session的具体使用方式
安装中间件
命令:npm i cookie-session
使用方式
- //引入
- let cs = require("cookie-session");
- //使用中间件
- 服务器对象.use(cs({
- name:"中间件名称",
- keys:["秘钥字符串",...],
- maxAge:保质期时长 是一个数字 单位为ms
- }))
-
- //设置session数据
- app.get("/index",(req,res)=>{
- //添加session数据
- req.session.键名 = 键值
- })
- //使用session数据
- app.get("/login",(req,res)=>{
- //添加session数据
- req.session.键名
- })
注意:session这个方式存储状态 要优于 cookie
因为 session在网络上传递的 是 秘钥 因此 即便被截获 也不会有什么影响 保证了安全性
优于 传递的是秘钥 因此 不论 session中真正存储多少数据 网络上传递的都只是一个秘钥数据 也就减少了数据量 提高了网速。
- let express = require("express");
- let cS = require("cookie-session");
- let path = require("path");
- let app = express();
- app.use(express.urlencoded({extended:false}));
- app.use(express.json());
- //2.使用中间件
- app.use(cS({
- name:"session",
- keys:['abcDEF123&*']
- }))
- //3.存储session
- //用户直接在地址栏中 访问/login路由 加载登录页面
- app.get("/login",(req,res)=>{
- res.sendFile(path.join(__dirname,"login.html"))
- })
- //用户提交登录信息后 给用户响应登录状态 并存储登录状态(session)
- app.post("/login",(req,res)=>{
- let {un,pwd} = req.body
- if(un=="狗蛋"&&pwd=="gd123"){
- //存储session 记录登录状态
- req.session.flag = "success";
- res.send("登录成功");
- }else{
- req.session.flag = "fail";
- res.send("登录失败")
- }
- })
- //当用户在地址栏中 访问/index路由 对应响应数据 如果登录成功 响应 否则 响应
- app.get("/index",(req,res)=>{
- let flag = req.session.flag;
- if(flag=="success"){
- res.send("欢迎您,我的主人")
- }else{
- res.send("闲人免进")
- }
- })
- app.listen(3000)
在node开发中 我们如果想写html页面 可以有两种写法
直接写html
优点:写法简单
缺点:需要使用单独的js文件 对页面内容进行渲染
通过模板引擎 来编写页面
优点:可以直接在模板文件中 写入数据 可以直接渲染
缺点:相对而言 会稍微复杂一点
在express中 我们使用一个第三方中间件 来实现模板的编写——ejs
1.下载安装 模板引擎
命令:npm i ejs
2.给服务器配置要使用的模板引擎
app.set('view engine', 'ejs')
3.在项目目录中 创建view文件件 用来存放模板文件
4.在view文件夹中 编写模板文件
注意:模板文件 后缀名为 .ejs
5.初始化模板
模板文件 只有初始化之后 才能渲染出来
说明:其实配置的就是模板文件夹的路径
app.set('views',模板文件夹的绝对路径) 6.渲染模板
- app.get("/index",(req,res)=>{
- //使用res形参的render方法 进行模板的渲染
- res.render('模板文件名',模板要使用到的数据(通常是一个对象))
- })
渲染普通数据
<%= 要渲染的数据 %>
注意:我们在模板中渲染的诗句 其实是 服务器中渲染模板 的render方法中 数据对象的属性
注意:我们在渲染数据对象的属性的时候 只写属性名就可以 不要写对象名.属性名
条件渲染
<% if(条件){ %>
条件成立要渲染的html内容
<% else if(条件2){ %>
满足条件2的内容
<% }else{ %>
条件不成立渲染的html内容
<% } %> 循环渲染
<%for(xxxx){%>
循环渲染的内容
<% } %> 引入其他模板
<%-include("要引入的模板路径",引入的模板要使用的数据)%> 注意:模板路径可以省略 后缀名