47 Express框架开发

 

 

47 Express框架开发

项目开发流程

1、初始化 npm init -y

2、下载你已知包 npm i express

3、创建入口文件app.js ( main.js )

4、搭建express服务器基本框架(引包、开端口)

5、定义路由

6、在路由书写自己的业务了(难点)

中间件种类

应用级别的中间件

app.get/app.post

app.method的语法都可以简单称为中间件

错误中间件

特点:写后面。中间件和路由是有前后顺序的。所以错误中间件写后面。

404错误:

express默认支持404,但是不美观,所以我们要优化


//错误中间件其实就是自定义中间件放在了所有路由的最后面而已。
//404页面
app.use( (req,res)=>{
   res.status(404)  //设置404状态码
   // res.send('我是404页面')
   res.sendFile( path.join( __dirname,'views/404.html' ) )
} )

逻辑错误

比如:登录、注册、路径地址等一些参数必须传递....有很多这种逻辑。就需要统一处理。

  1. 在对应的路由的回调中写上第3个形参 next callback( req,res,next )

    1)如果后面没有定义错误中间件,而next在某个路由中调用了,并且传递了一个字符串,则直接输出并且是500错误

  2. 在所有路由的最后面定义一个逻辑错误中间件(其实也是自定义中间件)

    1)如果后面定义错误中间件(并且是4个参数),而next在某个路由中调用了,并且传递了一个参数,则不输出,而是匹配到错误中间件路由

    但是这个中间件需要4个参数 callback( err,req,res,next )

    err:接收next传递过来的错误消息 。

    app.get('/dologin',(req,res,next)=>{

       //必须是用户名和密码都必须传递  
           //req.query.username
           //req.query.password
       if( !req.query.username || !req.query.password ){
           let s = {
                       msg:'用户名或密码不能为空',
                       status:2
                  }
           // res.send( s )
           //next( '用户名或密码不能为空' ) //当next传递参数以后,返回的直接是500错误。
           next( s )
           return
      }
     
    })



    app.use((err,req,res,next)=>{
       //res.send('我是错误中间件::' + err.msg)
       let result = {
           message:err.msg,
           code:err.status,
           // list:err.result
      }
       res.send( result )
    })

     

内置中间件

express框架自带的中间件

1、express.static()

语法:express.static( [/前缀,] 一个静态资源目录 )

作用:开放静态资源 。

在前端除了html页面,其它都是静态资源 。我们要和项目联系起来:要通过你express开放的端口去访问静态资源。

之前是 res.sendFile() 返回静态资源文件 。但这不是正确的做法。

用法1:不带前缀的
//开放静态资源 : 最正确的做法换成绝对路径
app.use( express.static( path.join( __dirname,'public' ) ) )
//如何访问静态资源 :
   // http://localhost:端口号/不包含目录名称
   // 例如: http://localhost:端口号/js/index.js

 

用法2:带前缀
app.use( '/a',express.static( path.join( __dirname,'public' ) ) )
//如何访问静态资源 :
   // http://localhost:端口号/包含目录名称
   // 例如: http://localhost:端口号/a/js/index.js

补充:

只有html页面需要配置路由,静态资源不配置路由是用express.static去开放的

后端在改前端html页面的时候,静态资源的路径都以 / 开头。

后端在改前端html页面的时候,静态资源的路径都以 / 开头。

后端在改前端html页面的时候,静态资源的路径都以 / 开头。

47 Express框架开发

2、express.urlencoded()

作用:接收post传递过来的参数

语法:app.use( express.urlencoded( {extend:false|true} ) )

注意:配置在所有路由的前面

在路由中使用 req.body上存储了post的参数,当配置此中间,如果没有传递post参数则默认为空对象,如果没配置则为undefined

前端如何发送post请求:ajax、form表单的

如果是ajax则需要配置 Content-Type: application/x-www-form-urlencoded

form表单默认就是它 Content-Type: application/x-www-form-urlencoded

47 Express框架开发

 

表单提交时,使用请求体

47 Express框架开发

https://www.w3school.com.cn/tags/att_form_enctype.asp

47 Express框架开发

 

username=aaa&pass=bbb

querystring.parse()

qs.parse()/qs.stringify()

3、express.json()

作用:接收post传递过来的参数

语法: app.use( express.json() )

注意:配置在所有路由的前面

在路由中使用 req.body上存储了post的参数,当配置此中间,如果没有传递post参数则默认为空对象,如果没配置则为undefined

前端如何发送post请求: 请使用ajax发这类的json数据、使用Rest Client,表单提交不能设置application/json的请求头

47 Express框架开发

第三方中间件

本质上是npm上的一个三方包。

使用步骤

1、先下载

npm i 包名

2、引入( 看手册 )

找到usage或example

3、把example复制即可

serve-favicon

网站小图标的设置

var express = require('express')
var favicon = require('serve-favicon')
var path = require('path')

var app = express()
app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')))

// Add your routes here, etc.

app.listen(3000)

注意:刚配置好以后,可能不出来?

清除缓存或者改一个端口

svg-captcha

app.get('/createcode', function (req, res) {

//var captcha = svgCaptcha.create(); //创建一个验证码
   /*
      如果没有任何参数,则生成的 svg 图片有4个字符。
      size: 4 // 验证码长度
      ignoreChars: '0o1i' // 验证码字符中排除 0o1i
      noise: 1 // 干扰线条的数量
      color: true // 验证码的字符是否有颜色,默认没有,如果设定了背景,则默认有
      background: '#cc9966' // 验证码图片背景颜色
      默认图片的大小为150*50


      该函数返回的对象拥有以下属性
      data: string // svg 路径
      text: string // 验证码文字
  */

var captcha = svgCaptcha.create({
       size:6,
       ignoreChars:'0OoIiLl1',
       noise:3,
       color:true,
       background:'#cccccc',
       width:300,
       height:80
  });  


res.type('svg');  //设置返回的类型
res.send(captcha.data);
});

 

前端如何用

<img src="http://localhost:3300/createcode" id="img1" alt="">

   <script>
       let img1 = document.getElementById('img1'

       img1.onclick = function(){
           let t = Math.random()
           this.src = 'http://localhost:3300/createcode?' + t
      }

   </script>

 

六、文件上传

 

七、cookie

介绍

特点

应用场景

实现原理

 

八、session

简介

特点

应用场景

实现原理

九、模板引擎

 

十、express脚手架

 

十一、koa框架

 

 

前后端数据交互总结

1层:会前后端交互(使用ajax调用接口)

2层:会用express+mysql写一些接口

3层:前后端一起干(全栈工程师)

请求方法 编码格式 前端要传输的数据格式 后端如何获取 应用场景
GET url地址后面(querystring) url?key1=value1&key2=value2 不需要中间件:req.query 获取数据
POST applicaion/x-www-form-urlencoded form-data: key1=value1&key2=value2 express.urlencoded( { extend:true } ) 提交数据
POST applicaion/json(只能通过ajax) request-payload: '{ "key1":"value1","key2":"value2" }' express.json()  
POST mutilpart/form-data(可以使用表单) 文件流   文件上传
DELETE 同post     删除数据
PUT 同post     更新数据
上一篇:jvm性能调优实战 - 47超大数据量处理系统是如何OOM的


下一篇:Python系列 47 内置模块:hashlib