express复习
- express 三步走
- 引入express (需要下载 api地址-》npm)
1. 下载 npm i --save-dev express 2. 引入 const express=require('express')
- 启动服务
const app=express();
- 监听服务
app.listen(8080)
- express 强大的路由
1、路由可以通过正则进行匹配,用()进行分组,通过
req.params[0]
来获取对应的参数,也可以通过node自带的正则进行匹配
2、当匹配到第一个路由时下面的路由就不会再走了,如果想要走下面的路由需要在路由里面加上next()
;
3、路由的排序:两种顺序都不会影响下边路由执行
1)将不可变的路由放在上边,可变的放在下面,
2)将可变的路由放在上面,但是要在里面进行判断else 里面写next();因为send()后面不能写任何东西,会报错
-
get
- 三种路由状态
// 学生学好 app.get('/',(req,res)=>{}) app.get(/\student\/(\d{4})/,(req,res)=>{ console.log(req.params[0]) }) //老师工号 app.get('/teacher/:gonghao',(req,res)=>{ console.log(req.params.gonghao) }) //某个人工号 app.get(':/username/:id',(req,res)=>{ console.log(req.params.id) })
- 路由顺序1:将不可变的路由放在上边,可变的放在下面
//特殊用户 app.get(/admin/login,(req,res)=>{ }) //普通用户 app.get(':/username/:password',(req,res)=>{ })
- 路由顺序2:将可变的路由放在上面,但是要在里面进行判断else 里面写next();
let putong={ "teacher":["teacher1","teacher2"], "student":12 } //普通用户 app.get(':/username/:password',(req,res,next)=>{ //先到数据库中查,如果有就是普通用户,没有next() let username=req.params.username if(putong[username]){ res.send('普通用户') }else{ next() } }) //特殊用户 app.get(/admin/login,(req,res)=>{ console.log(req.params[0]) })
-
post
app.post(路由,(req,res)=>{})
-
use
app.use(路由,(req,res)=>{})
-
express中的请求与原生node请求参数的获取
-
get请求
- express中get请求获取地址栏中的参数 通过 req.query
app.get(路由,(req,res)=>{ res.send('send里面既可以json字符串或对象或者buffer') console.log(req.query.xxx) //获取地址栏参数 })
- 原生node中get请求 获取地址栏参数 通过url.parse
1)、const url = require('url') 2)、url.parse(req.url,true).query
-
post请求
- express中 post请求 获取参数需要通过 bodyParser
const bodyParser = require('body-parser') app.use(bodyParser.urlencoded({extended:false})) app.post(路由,(req,res)=>{ res.send('send里面既可以传字符串或json对象或者buffer') });
注意:如果请求的是大型文件(音频、视、图片、word)还是需要formidables模块,普通数据是可以用body-parser
body-parser三步曲:
1). 引入模块:bodyParser=rquire('body-parser')
2). app.use(bodyParser.urlencoded({extended:false}))
3). 通过req.query.xxx 拿到前端通过请求体提交的数据- 原生node 中post 请求接收参数
let str=''; 1)、req.on('data',(data)=>{ str+=data; }) 2)、req.on('end',()=>{ //将拼接好的字符串转成对象;这里的querystring同样需要require进来 let bodyParser=querystring.parse(str) res.end() })
-
-
express + ejs
- 设置模版引擎
1. 下载ejs npm i --save-dev ejs app.set('view engine','ejs')
- 当请求某个页面时,开始渲染页面
//后台 app.get('/book', (req, res) => { let yundong = [ {name: "健身", des: "修身"}, {name: "游泳", des: "好身材"}, {name: "跑步", des: "瘦腿"} ]; res.render('book', { yundong//这个名字必须和静态页面名字相同 }) //前端 <% for(var i=0;i<yundong.length;i++){%> <li>我喜欢的运动是<%= yundong[i].name%>;<%= yundong[i].des%></li> <%}%>
注意: 1、虽然express中可以不用引入ejs模版,但是必须要在当前项目中下载ejs 模块,否则会报错;
2、 For循环,条件语句直接用<%%>;如果具体复制,必须要等号<%=%> -
send
- send与原生node中end的区别
- send里面既可以传字符串或json对象或者buffer
- send比end用法更加强大
- send与render的区别
- send一般用来做测试,render一般用来做渲染页面
- send一般可以配合状态码输出:res.status('404').send('文件没找到')
- send与原生node中end的区别
-
设置文档类型
- 原生node通过res.writeHeader(200,'Content-Type':'text/html;charset=UTF-8')
- express中通过res.set('Content-Type','text/html')