Express框架

作者: 叽里咕呱 | 来源:发表于2021-12-05 20:20 被阅读0次

    一、Express框架

    (1)定义

    Express是一个基于Node平台的web应用开发框架,它提供了一系列的强大特性,帮助你创建各种Web应用。
    使用 npm install express 命令进行下载。

    (2)Express框架特性

    ① 提供了方便简洁的路由定义方式
    ② 对获取HTTP请求参数进行了简化处理
    ③ 对模板引擎支持程度高,方便渲染动态HTML页面
    ④ 提供了中间件机制有效控制HTTP请求
    ⑤ 拥有大量第三方中间件对功能进行扩展

    二、基本使用步骤

    (1)引入Express框架

    let express = require('express')
    

    (2)使用框架创建web服务器

    通过express函数,创建并返回一个web服务器对象。

    let app = express()
    

    (3)程序监听端口

    启动服务器,并监听一个端口号(端口号是自定义的)。

    app.listen(8848,()=>{
        console.log('服务器成功开启,端口号是8848');
    })
    

    (4)客户端访问路由

    启动服务器,并监听一个端口号(端口号是自定义的)。

    // 当客户端以get方式访问/路由时
    app.get('/', (req, res) => {
       // 对客户端做出响应,send方法会根据内容的类型自动设置请求头
       res.send('Hello Express'); // <h2>Hello Express</h2>   {say: 'hello'}
    });
    

    三、路由

    路由(Routing)是由一个 URI(或者叫路径)和一个特定的 HTTP 方法(GET、POST 等) 组成的,涉及到应用如何响应客户端对某个网站节点的访问。

    (1)客户端以get方式访问 / 路由

    app.get('/', (req, res) => {
       // 对客户端做出响应
       res.send('使用get方式请求了/路由'');
    });
    

    (2)客户端以post方式访问 /add 路由

    app.post('/add', (req, res) => {
       res.send('使用post方式请求了/add路由');
    });
    

    (3)使用get/post方式访问 /add 路由

    所有方式,app.all()优先级最高。

    app.all('/add',(req,res)=>{
       res.send('使用get/post方式请求了/add路由');
    })
    

    四、中间件

    1、中间件定义

    中间件就是一堆方法,可以接收客户端发来的请求、可以对请求做出响应,也可以将请求继续交给下一个中间件继续处理。
    中间件主要由两部分构成,中间件方法以及请求处理函数。中间件方法由Express提供,负责拦截请求;请求处理函数由开发人员提供,负责处理请求。

    app.get('请求路径', '处理函数') // 接收并处理get请求
    app.post('请求路径', '处理函数') // 接收并处理post请求
    

    可以针对同一个请求设置多个中间件,对同一个请求进行多次处理。默认情况下,请求从上到下依次匹配中间件,一旦匹配成功,终止匹配。可以调用next方法将请求的控制权交给下一个中间件,直到遇到结束请求的中间件。

    app.get('/request', (req, res, next) => {
          req.name = "张三";
          next();
    });
    app.get('/request', (req, res) => {
          res.send(req.name);
    });
    

    2、app.use中间件用法

    app.use 匹配所有的请求方式,可以直接传入请求处理函数,代表接收所有的请求。所有的请求,都会先走use,作用是拦截器。
    实际开发中,我们可以通过use中间件方法去判断用户的权限,从而确定该用户能否继续请求相关接口。

    app.use((req,res,next)=>{
        console.log(req.url);
        // next方法,表示继续往下执行
        next()
    })
    

    app.use 第一个参数也可以传入请求地址,代表不论什么请求方式,只要是这个请求地址就接收这个请求。

    app.use('/admin', (req,res,next)=>{
        console.log(req.url);
        // next方法,表示继续往下执行
        next()
    })
    

    3、中间件应用

    (1)路由保护,客户端在访问需要登录的页面时,可以先使用中间件判断用户登录状态,用户如果未登录,则拦截请求,直接响应,禁止用户进入需要登录的页面。
    (2)网站维护公告,在所有路由的最上面定义接收所有请求的中间件,直接为客户端做出响应,网站正在维护中。
    (3)自定义404页面。

    4、错误处理中间件

    在程序执行的过程中,不可避免的会出现一些无法预料的错误,比如文件读取失败,数据库连接失败。
    错误处理中间件是一个集中处理错误的地方。

    app.use((err, req, res, next) => {
       res.status(500).send('服务器发生未知错误');
    })
    

    当程序出现错误时,调用next()方法,并且将错误信息通过参数的形式传递给next()方法,即可触发错误处理中间件。

    app.get("/", (req, res, next) => {
       fs.readFile("/file-does-not-exist", (err, data) => {
           if (err) {
              next(err);
           }
       });
    });
    

    5、捕获错误

    在node.js中,异步API的错误信息都是通过回调函数获取的,支持Promise对象的异步API发生错误可以通过catch方法捕获。
    异步函数执行如果发生错误,通过 try...catch 可以捕获异步函数以及其他同步代码在执行过程中发生的错误。

    app.get("/", async (req, res, next) => {
       try {
           await User.find({name: '张三'})
       }catch(ex) {
           next(ex);
       }
    });
    

    五、跨域

    1、定义

    同源策略:是浏览器的一种安全策略。
    同源:协议名、主机名(域名或ip地址)、端口号必须完全相同。
    跨域:就是违背同源策略。
    ajax请求,必须要遵循同源策略。

    2、解决跨域

    (1)JSONP

    JSONP是一个非官方的跨域解决方案。JSONP 就是利用script标签的跨域能力来发送请求的,只支持get请求。
    例如:img、link、iframe、script。

    (2)CORS

    CORS跨域资源共享,是官方的跨域解决方案。
    跨源资源共享标准新增了一组HTTP首部字段,允许服务器声明哪些源站通过浏览器有权限访问哪些资源。
    设置响应头,允许跨域请求:

    response.setHeader('Access-Control-Allow-Origin','*')
    

    允许自定义请求头信息,响应头*表示所有类型的头信息都可以接受:

    response.setHeader('Access-Control-Allow-Headers','*')
    

    六、get请求

    1、get请求参数的获取

    req.query接收前端传递的GET请求参数,框架内部会将GET参数转换为对象并返回。
    接收地址栏中问号后面的参数,例如: http://localhost:3000/getStudents?name=zhangsan&age=30

    app.get('/getStudents',(req,res)=>{
        console.log(req.query);  // {"name": "zhangsan", "age": "30"}
    })
    

    2、定义get请求接口

    req是请求对象,里面保存的是客户端传过来的请求参数。
    res是响应对象,用于给客户端响应结果。
    res.send()将结果返回给前端。

    app.get('/getStudents',(req,res)=>{
        console.log(req.query);  // 获取GET参数
        res.send('hello')
    })
    

    七、post请求

    1、post请求参数的获取

    req.body接收前端传递过来的POST请求参数。

    接收POST请求参数,服务器需要进行设置。
    (1)通过express.json()中间件,解析表单中的JSON格式数据。
    (2)通过express.urlencoded()中间件,解析表单中的url-encoded格式数据。

    // 设置允许接收json格式的数据({"name":"张三","age":20})
    app.use(express.json())
    // 设置允许接收urlencoded格式的数据("name=张三&age=20")
    app.use(express.urlencoded({extended:false}))
    

    2、定义post请求接口

    app.post('/add', (req, res) => {
        console.log(req.body);  // 获取POST参数
        res.send('hello')
    })
    

    八、静态资源的处理

    通过Express内置的express.static可以方便地托管静态文件,例如img、CSS、JavaScript 文件等。
    设置后,public 目录下面的文件就可以访问了。

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

    相关文章

      网友评论

        本文标题:Express框架

        本文链接:https://www.haomeiwen.com/subject/cotwxrtx.html