• Express框架---中间件


    使用中间件

    Express是一个自身功能极简,完全是路由和中间件构成一个web开发框架:从本质上来说,一个Express应用就是在调用各种中间件。

    中间件是可以访问请求对象 (req),响应对象(res)以及next应用程序请求-响应周期中的函数。

    中间件就是在请求后,响应前要执行的函数,中间件就是函数使用app.use() 方法,可以给express应用,添加任意中间件功能函数。

    中间件分类

    • 内置中间件

    • 自定义中间件

    • 错误处理中间件
    • 第三方中间件


    1.​​​​​​内置中间件

    从版本4.x开始, Express不再依赖于 Connect。之前包含在 Express中的中间件功能现在位于单独的模块中; 查看 中间件功能列表

    Express具有以下内置中间件功能:

    • express.static提供静态资源,如HTML文件,图像等。
    • express.json使用JSON有效负载解析传入的请求。注意:适用于Express 4.16.0+
    • express.urlencodedURL编码的有效负载解析传入的请求。 注意:适用于Express 4.16.0+

    1. express.static()

    指定一个目录为静态资源目录

    客户端可以直接访问静态资源目录中的文件(目录暴露出来)

    代码示例:

    app.use(express.static(path.join(__dirname,"public")))

    2. express.json()

    解析post方式提交的application/json格式的数据

    代码示例:

    app.use(express.json())

    3. express.urlencoded()

    解析post方式提交的application/x-www-form-urlencoded 格式的数据

    代码示例:

    app.use(express.urlencoded({extended:false}))

    2.自定义中间件

    根据需求自己定义中间件

    代码示例:

    1. //自定义中间件
    2. app.use(function (req, res, next) {
    3. console.log(Date.now() + ':我是中间环节....');
    4. next();
    5. })
    6. //跨域
    7. app.use((req, res, next) => {
    8. res.header("Access-Control-Allow-Origin", "*");//解决跨域
    9. next() //转发请求
    10. })
    11. //调用postData函数,会得到一个函数
    12. let postData = function () {
    13. return function (req, res, next) {
    14. let arr = []
    15. req.on('data', chunk => {
    16. arr.push(chunk)
    17. })
    18. req.on("end", () => {
    19. // console.log(Buffer.concat(arr).toString());
    20. req.body = Buffer.concat(arr).toString();
    21. next();
    22. })
    23. }
    24. }
    25. //自定义中间件 ---->取出post参数
    26. app.use(postData())

    3.错误处理中间件

    错误处理中间件总是需要四个参数。您必须提供四个参数以将其标识为错误处理中间件函数。即使您不需要使用该next对象,也必须指定它以保持签名。否则,该next对象将被解释为常规中间件,并且将无法处理错误。

    以与其他中间件函数相同的方式定义错误处理中间件函数,除了四个参数而不是三个,特别是签名(err, req, res, next))

     注意:错误处理中间件,一般出现在代码的下面

    1. //错误处理中间件
    2. app.use(function(req,res){
    3. res.send({
    4. code:500,
    5. msg:"地址错误,请检查后重新访问"
    6. })
    7. })

    4.第三方中间件

    使用第三方中间件为Express应用程序添加功能。

    安装Node.js模块以获得所需的功能,然后在应用程序级别或路由器级别将其加载到您的应用程序中。 

    示例:

    1. serve-favicon

    可以设置前端页面访问时的图标

    1. 安装:
    2. npm install server-favicon
    3. 引入:
    4. const favicon=require("serve-favicon")

     代码示例:

    app.use(favicon(path.join(__dirname,"favicon.ico")))
    2. svg-captcha

    是一个可以生成验证码的第三方中间件

    安装:

    npm  install  svg-captcha

     引入:

    1. //导入验证码生成中间件
    2. const svgCaptcha= require("svg-captcha")
    代码示例: 
    1. //生成验证码
    2. router.get('/code',(req,res)=>{
    3. //创建验证码对象
    4. // const captcha= svgCaptcha.create();
    5. const captcha= svgCaptcha.create({
    6. size:5, //验证码字符个数
    7. ignoreChars:"0oi1l",//忽略字符
    8. noise:5,//干扰线
    9. background:"#eeeeee",
    10. color:true,//字符是否有颜色
    11. });
    12. console.log(captcha.text);
    13. res.type("svg");//设置媒体类型(MIME)
    14. res.send(captcha.data);//将svg格式的图片响应给前端
    15. })
    3. formidable

    文件上传

    安装:

    npm install formidable

     引入:

    const formidable=require(“formidable”)

    代码示例:

    服务器端代码:

    1. //文件上传
    2. app.post("/upload", (req, res) => {
    3. const fd = formidable({//配置项
    4. // encoding:""// 编码
    5. // uploadDir:"",//上传文件保存目录
    6. //filename:""
    7. uploadDir: path.join(__dirname, "temp")
    8. });
    9. //解析文件----接收文件
    10. fd.parse(req, function (err, fields, files) {
    11. if (err) {
    12. res.send("上传失败:" + err)
    13. return;
    14. }
    15. //上传成功
    16. // console.log("fields:", fields);//字段 { usernmae: '李四' }
    17. // console.log("files:", files);//文件信息
    18. //将缓存文件,处理为正常文件
    19. //1.取后缀名
    20. let extName = path.extname(files.myfile.originalFilename) //从文件的默认名称中,取出后缀名 xx.jpg---> .jpg
    21. //2,生成新文件
    22. let oldPath = files.myfile.filepath;//旧路径
    23. let newPath = oldPath + extName//新路径
    24. fs.renameSync(oldPath, newPath)
    25. res.send("上传成功")
    26. })
    27. });

    前端代码:

    表单格式提交

    1. "http://localhost:3000/upload" method="post" enctype="multipart/form-data">
    2. <label for="">用户名:label>

    补充

    前后端数据交互总结

    请求方法编码格式前端要传输的数据格式后端如何获取应用场景
    GETurl地址后面(querystring)url?key1=value1&key2=value2不需要中间件:req.query获取数据
    POSTapplicaion/x-www-form-urlencodedform-data: key1=value1&key2=value2express.urlencoded( { extend:true } )提交数据
    POSTapplicaion/json(只能通过ajax)request-payload: '{ "key1":"value1","key2":"value2" }'express.json()
    POSTmutilpart/form-data(可以使用表单)文件流文件上传
    DELETE同post删除数据
    PUT同post更新数据
  • 相关阅读:
    【AAAI 2024】解锁深度表格学习(Deep Tabular Learning)的关键:算术特征交互
    Jenkins--基础--6.1--Pipeline--介绍
    LoRa和LoRaWAN有什么区别?工业网关能用吗?
    商业插画师走尺印象:只为做生活的设计师
    如何测试响应式网站
    涨粉超100万,这些博主的内容密码是什么?
    Java基础数组静态和动态初始化时机
    【CVPR 2022】半监督目标检测:Dense Learning based Semi-Supervised Object Detection
    学生家乡网页设计作品静态HTML网页—— HTML+CSS+JavaScript制作辽宁沈阳家乡主题网页源码(11页)
    计算机网络——随机接入
  • 原文地址:https://blog.csdn.net/m0_61963865/article/details/132629533