• Express框架


    目录

    Express

    使用

    使用字符串模式的路由路径示例

    使用正则表达式的路由路径示例

    多个回调函数的情况 

    简便写法—以数组的形式

    路由中间件

    express中间件

    应用级中间件

    路由中间件

    错误处理中间件

    内置中间件

    Express内置的express.static管静态文件

    第三方中间件

    获取请求参数

    get

    post 

    配置post解析参数中间件

    服务端渲染(模板引擎)

    前言

    使用 

    Express

    基于node.js平台,快速,开放,极简的web框架

    npm初始化:npm init

    项目内安装express:npm i express

    导入express模块:const express=require("express")

    注意:得到的返回值express是一个函数

    获取app对象:const app=express()

    使用

    1. const express=require("express")//注意:得到的返回值express是一个函数
    2. const app=express()
    3. app.get("/",(req,res)=>{
    4. res.send("<h1>hello world<h1/>")//也可以解析成html
    5. })
    6. app.get("/a",(req,res)=>{
    7. res.send({
    8. name:"lili",
    9. age:23
    10. })
    11. })
    12. app.listen(3000,()=>{
    13. console.log("server start");
    14. })

    注意:

    • get方法后的第一个参数为具体路由路径,第二个为回调函数
    • send方法可以向前端响应内容,可以响应json数据以及html内容

    使用字符串模式的路由路径示例

    1. const express=require("express")//注意:得到的返回值express是一个函数
    2. const app=express()
    3. //匹配ac或abc
    4. app.get("/ab?c",(req,res)=>{
    5. res.send("ab?cd")
    6. })
    7. //匹配/ab/……
    8. //注意……中可以放很多字符,但不能放/(占位符)
    9. app.get("/ab/:id",(req,res)=>{
    10. res.send("ok")
    11. })
    12. //匹配a然后n个b然后cd
    13. app.get("/ab+cd",(req,res)=>{
    14. res.send("ab+cd")
    15. })
    16. //匹配ab任意字符cd
    17. app.get("/ab*cd",(req,res)=>{
    18. res.send("ab*cd")
    19. })
    20. //监听3000端口
    21. app.listen(3000,()=>{
    22. console.log("server start");
    23. })

    使用正则表达式的路由路径示例

    1. const express=require("express")//注意:得到的返回值express是一个函数
    2. const app=express()
    3. //匹配任何路径中含有a的路径
    4. app.get(/a/,(req,res)=>{
    5. res.send("/a/")
    6. })
    7. //匹配以fly结尾的
    8. app.get(/.*fly$/,(req,res)=>{
    9. res.send("/.*fly$/")
    10. })
    11. //监听3000端口
    12. app.listen(3000,()=>{
    13. console.log("server start");
    14. })

    注意:

    • 回调函数内还有第三个参数next()用来决定是否执行下一个回调函数
    • 使用多个回调函数处理路由,(在不加next()的情况下)当第一个回调函数成功时执行下一个回调函数,加了next参数以后,下面如果不用next函数表示不放行
    • next放行之后上一个回调函数内的属性值,下一个回调函数同样适用
    • send一次数据以后,next函数便失效了,所以一般在最后一次回调中写send

    多个回调函数的情况 

    1. const express=require("express")//注意:得到的返回值express是一个函数
    2. const app=express()
    3. app.get("/home",(req,res,next)=>{
    4. console.log("验证token");
    5. if(true){
    6. next()//放行
    7. }else{
    8. res.send("err")
    9. }
    10. },(req,res)=>{
    11. //查询数据库,返回内容
    12. res.send({list:[1,2,3,4]})
    13. })
    14. //监听3000端口
    15. app.listen(3000,()=>{
    16. console.log("server start");
    17. })

    简便写法—以数组的形式

    1. const express=require("express")//注意:得到的返回值express是一个函数
    2. const app=express()
    3. var a=(req,res,next)=>{
    4. console.log("a");
    5. next()
    6. }
    7. var b=(req,res,next)=>{
    8. console.log("b");
    9. next()
    10. }
    11. var c=(req,res,next)=>{
    12. console.log("c");
    13. res.send("hello")
    14. }
    15. app.get("/exp",[a,b,c])
    16. //监听3000端口
    17. app.listen(3000,()=>{
    18. console.log("server start");
    19. })

    路由中间件

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

    express中间件

    • 应用级中间件
    • 路由级中间件
    • 错误处理中间件
    • 内置中间件
    • 第三方中间件

    应用级中间件

    应用级别中间件绑定到app对象使用app.use()和app.METHOD(),其中,METHOD是需要处理的HTTP请求方法,例如GET,PUT,POST等等全部小写

    app.use(a)

    注册a中间件,之后的app都会先执行a中间件

    app.use("/home",a)

    表示只响应后缀为/home的路径 

    1. const express=require("express")//注意:得到的返回值express是一个函数
    2. const app=express()
    3. var a=(req,res,next)=>{
    4. console.log("a");
    5. next()
    6. }
    7. app.use(a)//注册a中间件,之后的app都会先执行a中间件
    8. // app.use("/home",a)表示只响应后缀为/home的路径
    9. var b=(req,res,next)=>{
    10. console.log("b");
    11. next()
    12. }
    13. var c=(req,res,next)=>{
    14. console.log("c");
    15. res.send("hello world")
    16. }
    17. app.get("/exp",[b,c])
    18. //监听3000端口
    19. app.listen(3000,()=>{
    20. console.log("server start");
    21. })

    路由中间件

    1. const express=require("express")
    2. const app=express()
    3. //导入路由级中间件
    4. const indexRouter=require("./router2/indexRouter")
    5. //应用级别中间件
    6. app.use(function(req,res,next){
    7. console.log("验证token");
    8. next()
    9. })
    10. //从此以后对应/api的路径之后的路径都由路由中间件处理
    11. app.use("/api",indexRouter)
    12. app.listen(3000,()=>{
    13. console.log("server start");
    14. })
    1. //indexRouter文件内
    2. const express=require("express")
    3. //路由级中间件
    4. const router=express.Router()
    5. router.get("/home",(req,res)=>{
    6. res.send("home")
    7. })
    8. router.get("/login",(req,res)=>{
    9. res.send("login")
    10. })
    11. //导出路由级中间件
    12. module.exports=router

    错误处理中间件

    1. var express=require("express")
    2. const app=express()
    3. app.get("/home",(req,res,next)=>{
    4. console.log("1");
    5. next()
    6. },(req,res)=>{
    7. console.log("2");
    8. res.send("hello world")
    9. })
    10. //错误处理中间件要放到最后
    11. app.use((req,res)=>{
    12. res.status(404).send("丢了")
    13. })
    14. app.listen(3000,()=>{
    15. console.log("server start");
    16. })

    注意:错误处理中间件一定要放到最后,表示出现错误到了最后一定会执行,而不是提前执行 

    内置中间件

    express.static是Express唯一的内置中间件。他基于serve-static,负责在Express应用中提托管静态资源。每个应用可有多个静态目录

    理解:只需要一句话就可以迅速的将一个目录打造成一个静态资源目录 利用Express托管静态文件

    Express内置的express.static管静态文件

    将静态资源文件所在的目录名作为参数传递给express.static中间件就可以提供静态资源文件的访问了。

    app.use(express.static('public'))

    假设public目录放置了图片、css和js文件就可以然后public目录下的文件就可以直接访问了

    1. const express=require("express")
    2. const app=express()
    3. //配置静态资源
    4. app.use(express.static("静态"))
    5. app.listen(3000,()=>{
    6. console.log("server start");
    7. })

    访问:http://localhost:3000/home.html

    在静态文件里的资源都是相对于存放目录的,因此,存放静态文件的目录名不会出现在URL中

    如果真想加:app.use("/静态",express.static("静态"))

    第三方中间件

    安装所需的node模块,并在应用中加载,可以在应用级加载,也可以在路由级加载

    下面的例子安装并加载一个解析cookie的中间件:cookie-parse

    npm初始化:npm init

    安装:npm install cookie-parser

    获取请求参数

    get

    获取get请求参数:req.query

    post 

    获取post请求参数:req.body

    注意:如果想要post请求参数生效必须配置中间件 

    新版express已经内置了此中间件,只需引入即可

    配置post解析参数中间件

    • app.use(express.json())——post参数格式为json格式时获取参数属性可用
    • app.use(express.urlencoded({extended:false}))——post参数格式为form编码形式时请求参数属性可用
    1. const express=require("express")
    2. const app=express()
    3. //配置解析post参数的中间件2种,分别适应两种类型,内置
    4. app.use(express.urlencoded({extended:false}))//post参数格式必须为-username=lili&password=1234
    5. app.use(express.json())//post参数格式必须为json格式
    6. //响应前端的get请求
    7. app.get("/home",(req,res)=>{
    8. console.log(req.query);//通过这种方式可以以对象的形式拿到前端传来的get请求的参数
    9. res.send("you are so cute")
    10. })
    11. //响应前端的post请求
    12. app.post("/login",(req,res)=>{
    13. console.log(req.body);//必须配置好中间件才能得到post参数对象
    14. res.send({ok:1})
    15. })
    16. app.listen(3000,()=>{
    17. console.log("server start");
    18. })

    服务端渲染(模板引擎)

    前言

    npm初始化:npm init

    安装ejs模板:npm i ejs

    需要在应用中进行如下设置才能让Express渲染模板文件

    方式1

    • views,放模板文件的目录,比如:app.set("views","./views")——渲染当前views目录
    • view engine,模板引擎,比如:app.set("view engine","ejs")——模板引擎为ejs

    方式2

    • app.set("views","./views")——渲染当前views目录
    • app.engine("html",require("ejs").renderFile)——支持模板引擎为html
    • app.set("view engine","html")——模板引擎为html 

    注意:

    • 必须在路由里面渲染模板才能生效
    • html与ejs不可以在一个目录中共同渲染

    使用 

    1. const express=require("express")
    2. const app=express()
    3. const router=require("./luyou")
    4. app.set("views","./views")
    5. app.set("view engine","html")
    6. app.engine("html",require("ejs").renderFile)//支持直接渲染html页面
    7. app.use("/help",router)
    8. app.get("/app",(req,res)=>{
    9. res.send("page")//这里用render不好用
    10. })
    11. app.listen(3000,()=>{
    12. console.log("server start");
    13. })
    1. //luyou.js文件内
    2. const express=require("express")
    3. const router=express.Router()
    4. router.get("/view",(req,res)=>{
    5. var list=["1","2","3"]
    6. res.render("view",{list:list})//跳转所在的view.ejs页面并动态设置变量
    7. })
    8. router.get("/json",(req,res)=>{
    9. res.json([1,2,3,4])//返回json数据
    10. })
    11. router.get("/html",(req,res)=>{
    12. res.render("login")
    13. })
    14. module.exports=router
    1. <!-- view.ejs内 -->
    2. <body>
    3. login页面
    4. <ul>
    5. <% for(var i=0;i<list.length;i++){ %>
    6. <li><%=list[i] %> </li>
    7. <% } %>
    8. </ul>
    9. </body>

    注意:虽然代码一块一块的,但仍遵循顺序执行 

    渲染页面:res.render("返回的页面名",{a:b}) 

    注意:{a:b}中a为带去页面的变量,b为当前后端变量

    返回json数据:res.json(数据)

    访问view.ejs页面:http://localhost:3000/help/view

    注意:

    • <%#内容%>这种注释相对于html注释不会在查看源代码中显示出来
    • <%=表达式%>标签相对于<%-表达式%>中第2个如果表达式所对应的结果是一串html代码,则第一个不会解析该html代码,第二个会解析
    • <%-include(”./header.ejs",{a:b})%>,导入公共的模板内容,可以放在ejs/html的body的任何地方

     

  • 相关阅读:
    【python的输入】sys.stdin与sys.argv
    OpenMesh 获取网格面片各个顶点
    【Go实现】实践GoF的23种设计模式:装饰者模式
    k8s-pod管理 3
    Spring Cloud Consul 入门指引
    重生奇迹MU套装大全中的极品属性
    openEuler 22.03 x86架构下docker运行arm等架构的容器——筑梦之路
    docker、docker-compose安装教程,很详细
    深度学习之基于CT影像图像分割检测系统
    视频汇聚/视频云存储/视频监控管理平台EasyCVR录像存储功能如何优化?具体步骤是什么?
  • 原文地址:https://blog.csdn.net/m0_60027772/article/details/125616382