NODEJS day_05(5.25)RESTful、ApiPost

一、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)=>{
    res.sendFile(__dirname+'/login.html')
})

//添加插件,可以将所有post传递参数转为对象
//将转为对象放入到req.body
//告诉内部如何转为对象

app.use(express.urlencoded({
    extended:true   
}))

<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.jsuser.js

//引入模块
const express=require('express')
//引入用户路由器模块
const userRouter=require('./user.js')
//引入商品路由器
const productRouter=require('./product.js')
//console.log(userRouter)  //成功拿到暴露对象
//创建服务器

const app=express()
//设置端口
app.listen(3000,()=>{
    console.log('连接服务器成功')
})
//将引入的路由器挂载到WEB服务器,WEB服务器才能使用里面的路由
//给这组路由器添加说明:这是用户的

app.use('/user',userRouter)
//挂载商品路由器
//给这组路由器添加说明:这是商品的

app.use('/product',productRouter)

//在路由前添加路由器名称,对路由进行了分组说明
//http://127.0.0.1:3000/user/list
//http://127.0.0.1:3000/product/list
//http://127.0.0.1:3000/product/detail

//引入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')
const app=express()
app.listen(3000,()=>{
    console.log('服务器连接成功')
})

第四步:创建函数:验证用户身份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’的请求,拦截到以后自动调用函数fnapp.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')
const app=express()
app.listen(3000)

//托管静态资源到public目录,如果浏览器端要请求静态资源,会自动到public目录下去寻找
//内置中间件可以实现

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

请求的格式是直接在端口后拼接需要请求的资源(:3000/1.html)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值