Express

一、什么是Express ?

  express是一个基于Node平台的web应用开发框架, 它提供了一系列强大特性,可以帮助创建各种web 应用

  下载: npm install express

二、Express框架特性

  1、提供了方便简洁的路由定义方式

  2、对获取HTTP请求参数进行了简化处理

  3、对模板引擎支持程度高,方便渲染动态HTTP页面

  4、提供中间件机制有效控制HTTP请求

  5、拥有大量第三方中间件对功能进行扩展

三、Express初体验

  1、使用express框架创建web服务器

1 // 引入express框架
2     const exprss = require( ' express ' );
3 // 使用框架创建web服务器
4     const app = express();

  2、 express的get,post访问路由方式

 1 // get 访问方式
 2 app.get(' / ', (req, res)=>{
 3     // 对客户端做出响应,send方法会根据内容的类型自动设置请求头,自动设置http状态码和编码类型
 4     res.send( {say: ' hellow '} ); 
 5 })
 6 
 7 // post 访问方式
 8 app.post(' / ', (req, res)=>{
 9     res.send( <h2> 以post方式访问 <h2> ) 
10 })

四、Express中间件

  1、什么是中间件 ?

    (1)中间件就是一堆方法,可以接收客户端发来的请求,可以对请求做出响应,也可以将请求继续交给下一个中间件继续处理

    (2)中间件主要由两部分构成,中间件请求方法和请求处理参数

    (3)中间件方法由Express提供,负责拦截请求,请求处理参数由开发人员提供,负责处理请求

      

 

 

    (4)可以对一个请求设置多个中间件,对同一个请求进行多次处理

 

    (5)默认情况下,请求从上到下依次匹配中间件,一旦匹配成功,终止匹配

 

    (6)可以调用next方法将请求的控制权交给下一个中间件,直到遇到结束请求的中间件

 

       

 

   2、app.use中间件用法

    (1)app.use可以匹配所有的请求方法,可以不传路径,直接传入请求处理函数,代表拦截所有请求

      

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

      

 

 

     (3)路由保护,客户端在访问需要登录的页面时,可以先使用中间件判断用户登录状态,如果未登录则拦截请求做出响应,禁止用户进入需要登录的页面

 1 app.use('/admin', (req, res, next)=>{
 2     // 假定这个是登录状态 
 3     const isLogin = false;
 4     if(isLogin){
 5         next();
 6     }else{
 7         res.send('禁止未登录用户访问');
 8     }
 9 
10 })

    (4)网站维护,直接拦截所有请求做出响应

1 app.use((req, res)=>{
2     res.send('网站维护中'); 
3 })

    (5)自定义404页面

1 // 如果为匹配到对应路由
2 app.use((req, res)=>{
3     res.status(404).send('当前访问页面不存在')
4 })

  3、错误处理中间件

  (1)在程序处理的过程中,不可避免的会出现一些无法预料的错误,比如文件读取失败,数据库连接失败,错误处理中间件是一个集中处理错误的地方(err只能捕获同步代码)

  

 

 

  (2)异步API错误用回调函数next()方法捕获

  

 

 

  (3)支持promise对象的异步API发生错误可以通过catch方法捕获

 

  (4)try , catch可以捕获异步函数以及其他同步函数在执行过程中发生的错误,但不能获取其他类型API的错误

 1 const express = require('express');
 2 const app = express();
 3 const fs = require('fs');
 4 const promisify = require('util').promisify;
  // promisify可以将方法转换成promise对象
5 const readFile = promisify(fs.readFile); 6 app.get('/index', async (req, res, next)=>{ 7 try{ 8 let file = await readFile('./next.js', 'utf8'); 9 res.send(file); 10 }catch(ex){ 11 next(ex); 12 } 13 }) 14 15 app.use((err, req, res, next)=>{ 16 res.status(500).send(err.message); 17 }) 18 19 app.listen(3000); 20 console.log('服务器启动成功');

 

五、构建模块化路由

  1、

  

  2、

 

 

   3、express路由的参数

  app.get('/index/:id', (req, res)=>{

    // req.params可以获取这种请求传入的参数

    res.send(req.params);

  })

  (1)/:id 是占位符, 它表示要匹配这个请求,地址后面一定要加上id参数,不然匹配不到

    如: localhost:3000/index/12

      12就是传入的id , 此时 req.params获取的是一个对象: { id: 12 }

六、Express请求参数的处理

  1、GET参数处理

  express框架使用req.query即可获得GET参数,框架内部自动将参数转换成对象并返回

  

 

 

   2、POST参数处理

  express接收post请求参数需要借助第三方包 body-parser

  

 

 

    (1)bodyParser.urlencode方法对请求进行处理,方法内部检测请求中是否包含请求参数,如果包含接收参数并转换成对象类型,然后为req的请求对象添加属性,属性名为body,将请求参数赋给body,然后调用next()

   (2)extended: false : 为false时,内部用querystring对参数进行处理。 为true时,使用qs的第三方模块对参数进行处理,也可以将参数转为对象形式,功能更强大

七、静态资源的处理

  通过express内置的express.static可以方便的托管静态资源

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

八、模板引擎 : express-art-template

  为了使art-template更好的和express框架配合,模板引擎官方在原来的art-template的基础上封装了express-art-template

  下载:两个都要下载

      npm install art-template   express-art-template  

 

 

     

 

 

   app.local对象

    如果有公共属性是所有模板都需要用到的,就将它设置到app.local对象下

    

 九、请求(req)

 1、获取路径

  (1)、req.originalUrl  // 获取原始的请求路径  带参数

  (2)、req.baseUrl     // 获取根目录

  (3)、req.path    //  获取当前请求目录

  (4)、req.url     //   获取当前请求目录  带参数

  (5)、第三方模块url 中的pathname 与 req.path 一样

app.use('/admin', function (req, res, next) {
 // GET 'http://www.example.com/admin/new?id=11'
  console.dir(req.originalUrl) // '/admin/new?id=11'
  console.dir(req.baseUrl) // '/admin'
  console.dir(req.path) // '/new'
  console.dir(req.url)  // '/new?id=11'
  next()
})

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2020-07-30 01:02  书爱  阅读(896)  评论(0编辑  收藏  举报