一、post传参
(登录页面必须使用post传参,有在网址上隐藏参数的功能)
1.需要使用中间插件将post传参转为对象
app.use(express.urlencoded({ extended:ture //告诉内部是否使用第三方模块转为对象(有默认的,可以不写) })) |
在路由中使用req.body 即可获取对象
练习:添加路由(get /login),要求响应登录网页login.html,点击提交向服务发请求(post/login2) | |
第一步:建立连接,加入插件(nodejs运行代码) | 插入的login.html代码 |
app.get('/login',(req,res)=>{ //添加插件,可以将所有post传递参数转为对象 | <h1>用户登录</h1> <form method="post" action="/login2"> 用户:<input type="text" name="user"><br> 密码:<input type="text" name="pwd"><br> <input type="submit"> </form> |
添加路由(post /login2),监听按钮提交的请求,响应“登录成功” | |
app.post('/login2',(req,res)=>{ //获取post传递的参数 console.log(req.body) res.send('登录成功') }) |
练习:添加路由(get /add),响应product.html;点击提交向服务器发请求(post /myadd),添加路由,获取post传递的参数,响应‘添加成功 商品名称:xxx’ | |
node.js代码 | 插入的product.html代码 |
app.get('/add',(req,res)=>{ res.sendFile(__dirname+'/product.html') }) app.use(express.urlencoded( {extended:true} )) app.post('/myadd',(req,res)=>{ console.log(req.body) res.send(`添加成功<br>商品名称:${req.body.name}`) }) | h1>添加商品</h1> <form method="post" action="myadd"> 名称:<input type="text" name="name"><br> 价格:<input type="text" name="pir"><br> 库存量:<input type="text" name="num"><br> <input type="submit"> </form> |
2.还可以使用body-parser中间介
const bodyParser=require('body-parser')
app.use(bodyParser)
二.路由器
用于管理一组路由,最终被WEB服务器所使用
路由器 1.创建路由器对象 const r=express.Router() 2.添加路由 3.暴露路由器对象 module.exports=r |
WEB服务器引入并挂载 app.use( '/分组名称', 引入的路由器 ) |
最终路由访问形式 http://127.0.0.1:3000/分组名称/路由的URL |
app.js | user.js |
//引入模块 //在路由前添加路由器名称,对路由进行了分组说明 | //引入express模块 const express=require('express') //创建路由器对象 const r=express.Router() //往路由器中添加路由 //添加用户列表由(get /list) r.get('/list',(req,res)=>{ res.send('这是商品列表') }) //暴露路由器对象,外部就可以得到里边的路由 module.exports=r |
练习:编写商品路由器product.js,创建路由器对象,添加路由(get /detail),响应‘这是商品的详情’,最后暴露路由器对象 在WEB服务器下引入路由器,最后进行挂载 | |
const express=require('express') const p=express.Router() p.get('/detail',(req,res)=>{ res.send('这是商品的详情') }) p.get('/list',(req,res)=>{ res.send('这是商品的列表') }) module.exports=p |
三.中间件
用来拦截对服务器请求
中间件分为应用级中间件、路由级中间件、内置中间件、错误处理中间件、第三方中间件
1.应用级中间件
也称为自定义中间件,就是一个函数,一旦拦截到自动调用函数
app.use( 拦截的URL, 函数 ) function 函数(req,res,next){ next() //往后执行,可能是下一个中间件或者路由 } |
练习:使用express创建WEB服务器,设置端口,添加路由(get /list),响应‘这是所有用户的列表,只有管理员有权查看’ | |
第一步:建立WEB服务器 | const express=require('express') |
第四步:创建函数:验证用户身份 | function fn(req,res,next){ //next控制是否往后执行,next是一个回调函数 console.log('拦截了请求,验证是否为管理员') //获取get所传递的参数 console.log(req.query) //查看用户是否为root //如果不是root,响应‘请提供管理员身份’,否则往后请求路由 if(req.query.user!=='root'){ res.send('请提供管理员身份') }else{ //往后执行,可能是下一个中间件或者路由 next() } } |
第三步:添加中间件(app.use),拦截对URL——‘/list’的请求,拦截到以后自动调用函数fn | app.use('/list',fn) |
第二步:用户列表路由 | app.get('/list',(req,res)=>{ res.send('这是所有用户的列表,只有管理员有权查看') }) |
练习:添加一个路由,删除用户的路由(get /delete),响应‘用户删除成功’ //添加中间件,拦截对/delete的请求,验证是否为管理员 |
function fn(req,res,next){ if(req.query.user!=='root'){ res.send('请提供管理员身份') }else{ next() } } app.use('/delete',fn) //app.use('/delete',函数) //添加多个中间件 app.get('/delete',(req,res)=>{ res.send('用户删除成功') }) |
练习:添加路由(get /shopping),用于将商品加入到购物车,传递商品的价格price,最后响应'添加成功 价格:xxx'; 添加中间件拦截对路由的请求,对价格打九折。 |
function dicount(req,res,next){ //获取get传递的参数并打九折 req.query.price*=0.9 next() } app.use('/shopping',dicount) app.get('/shopping',(req,res)=>{ res.send('添加成功 价格:'+req.query.price) }) |
2.路由级中间件
路由器的使用
app.use(拦截的URL, 引入的路由器)
一旦拦截到以后,会到指定的路由器下查找路由
3.内置中间件
express提供的中间件,可以直接使用
(1)将post传递参数转为对象
动态资源:根据传递的参数不同,响应的结果也不一样 (数据库的数据)
静态资源:每次请求,响应结果都是同样的 (文件)
(2)托管静态资源
浏览器端如果要请求静态资源(html,css,js,图像..),不需要通过路由响应,而是自动的查找
app.use( express.static('托管的目录') )
const express=require('express') //托管静态资源到public目录,如果浏览器端要请求静态资源,会自动到public目录下去寻找 |
请求的格式是直接在端口后拼接需要请求的资源(:3000/1.html)