node 静态资源服务中间件 错误路由处理中间件 next向下匹配 nodemon热更新 表单数据处理formidable cookie-parser中间件

Posted bnzw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了node 静态资源服务中间件 错误路由处理中间件 next向下匹配 nodemon热更新 表单数据处理formidable cookie-parser中间件相关的知识,希望对你有一定的参考价值。

一、中间件简介

? express本身功能极简,其他功能主要靠中间件来实现。中间件是封装了一个request对象和response对象的函数。 中间件的使用放在 app.use( ) 中。

二、静态资源服务中间件

app.use(express.static("./public"));

三、错误路由处理中间件

一般放在代码的最后,当用户的请求所有的路由都不能匹配时,由这个中间件来处理

app.use((request,response,next)=>{
  response.status(404);
  response.send("您访问的页面不存在");
})

四、next 向下匹配

express中的路由有一旦匹配上,就不再向下匹配的的特点。

假如有特殊情况:

例: /student/120301 访问学号为120301的学生信息

? /admin/login 使用管理员账号登录

解决方法一: 调整路由代码的顺序,将具体的放上面。

解决方法二: 使用next ,当满足条件时向下匹配。

app.get("/:student/:xuehao", (request,response,next)=>{
  if(request.params.student != "admin" ){
    response.send( `学生为:${request.params.student};学号为${ request.params.xuehao}` );
  }else{
    next();
  }
})
app.get("/admin/login", (requset,response)=>{
  response.send("admin账号登录");
})

五、nodemon 热更新

安装:

npm i nodemon -g

配置文件:

将 nodemon.json 文件复制到项目目录下

启动:

nodemon index

如果出现报错: 提示“此系统禁止运行脚本”。解决办法:

技术图片

用管理员身份打开powershell,或者命令行,输入:

set-ExecutionPolicy RemoteSigned

根据提示,输入 A 回车即可。

六、表单数据处理 formidable

用来实现表单中图片上传,数据提交等。

安装:

? npm i formidable

实现步骤:

1) 添加一个form,注意,如果有上传控件(type="file"),那么form的属性必须是:

<form action="/reg" method="POST" enctype="multipart/form-data">
  1. 配置formidable中间件

? 注意:配置代码需要写到路由的处理函数中

app.post("/reg", (request,response)=>{
  // formidable中间件的配置
  let form = formidable({multiples:true});
  // 设置上传文件的存放路径
  form.uploadDir = "./upload";
  // 从request对象中解析表单数据
  form.parse(request, (err,fields,files)=>{
    // err 错误消息
    // fields 是一个对象,为普通的控件的name和value属性组成的键值
    // files 是一个对象,为上传控件的name和上传内容组成键值
    console.log( fields );
    // console.log( files );
    response.writeHead(200, { ‘content-type‘: ‘application/json‘ });
    response.end(JSON.stringify({ fields, files }, null, 2));

  })
})

files 对象的结构为:

"files": {
    "photo": {
      "size": 157345,
      "path": "upload\\upload_059f0d1d9493ba4c669c338b85587d90",
      "name": "火车票.jpg",
      "type": "image/jpeg",
      "mtime": "2020-11-03T06:46:41.993Z"
    }
  }
  1. 因为formidable上传的文件没有后缀名,因此需要更名操作
  // 获取原文件名
    let oriName = files.photo.name;
    // 获取后缀名
    let extName = path.extname( oriName );
    // 要更名的文件
    let oldFile = files.photo.path;
    let newFile = oldFile + extName;
    // 将upload目录下上传的文件更名
    fs.rename(oldFile,newFile,(err)=>{
      if(!err){
        console.log("上传成功");
      }
    })

4) 将数据写入到txt文件中

? 注意:wirteFile 的第二个参数必须是字符串或Buffer。因此需要转换一下

        let obj = {name,age,photo:newFile};
        fs.writeFile("./data/"+name +".txt", JSON.stringify(obj), (err)=>{
          if(!err){
            response.send("报名成功");
          }
        })

常见错误:

Cannot set headers after they are sent to the client 不能在发送到客户端之后些响应头信息。

原因: 代码中有多次 response.end() 或者 response.send()

七、cookie-parser中间件

作用:cookie的管理

安装:

npm i cookie-parser

配置:

// 配置cookie-parser中间件,必须配置完成后才可以读取、设置cookie

app.use( cookieParser() );

使用:

设置普通cookie:

? response.cookie(cookie键,cookie值,options)

设置加密(签名)cookie:

? 1) 设置加密的密钥:

	cookieParser("offcn.com")	

? 2) 设置cookie 时添加 signed参数为true

? response.cookie("name","zhangsan",{signed:true})

读取普通cookie:

? 例:request.cookies.xingming

读取加密cookie:

? 例:request.cookie.signedCookies.xingming

domain: 域名。设置子域名(二级域名)是否可以访问cookie。 例:domain:‘.主域名‘ name=value:键值对,可以设置要保存的 Key/Value,注意这里的 name 不能和其他属性项的名字一样

expires: 过期时间(秒),在设置的某个时间点后该 Cookie 就会失效,如 expires=Wednesday, 09-Nov-99 23:12:40 GMT

maxAge: 最大失效时间(毫秒),设置在多少后失效

secure: 当 secure 值为 true 时, cookie 在 HTTP 中是无效,在 HTTPS 中才有效

path: 表示 cookie 影响到的路由,如 path=/。如果路径不能匹配时,浏览器则不发送这个 Cookie

httpOnly:默认为false,建议设置为true, 客户端将无法通过document.cookie读取到 COOKIE 信息,可防止 XSS 攻击产生

signed: 表示是否签名(加密) cookie, 设为 true 会对这个 cookie 签名,这样就需要用res.signedCookies 访问它,前提需要设置上面中间件app.use()传参 。未签名则用 res.cookies 访问

以上是关于node 静态资源服务中间件 错误路由处理中间件 next向下匹配 nodemon热更新 表单数据处理formidable cookie-parser中间件的主要内容,如果未能解决你的问题,请参考以下文章

详解express搭建http服务,通过路由和中间件获取静态文件和动态数据的实现原理

node基础3--express框架

Express框架概述

服务器node中间间利用express插件托管静态文件

Express框架请求与响应Express页面

Node 实现一个MVC相册资源管理器