express请求与响应

目录

1.express响应对象

1.1 send方法

1.2 sendFile() 方法

1.3 json()方法

1.4 redirect()重定向

1.5 download() 下载

1.6 end() 结束响应的方法

1.7 res.jsonp()方法

2.express请求对象

2.1 获取url地址中的参数(重要)

2.2 获取 post 的参数

2.3 路由参数

2.4 RESTful 路由风格


1.express响应对象

响应对象是指服务器想客户端响应数据的对象,包含所有要响应的内容

1.1 send方法

send方法用来想页面发送各种数据

语法:

res.send(data)   可以返回任意类型的数据

参数:要响应的内容

    //普通字符串
    // res.send('首页');
    //JSON数据
    // res.send({"name":"why",'age':18});
    //普通文本
    res.send(`<h2>普通文本</h2>`);

注意:不能发送数字,如果发送发送数字会被当成状态码.

  1. send(123),这样写会报错;
  2. send() 方法只能出现一次,重复无效还报错,因为send内含end()结束响应

设置状态码并返回内容可以使用如下的方法:

res.status(201).send('我就是一串字符串');

 send方法的优点:

  1. send 方法内部会自动检测要响应内容的类型; 
  2. send 方法会自动设置http状态码;
  3. send 方法会自动帮我们设置响应内容的内容类型及编码.

1.2 sendFile() 方法

响应文件

除了可以直接返回文件内容外还可以直接返回文件

语法:

res.sendFile( path, callback)

path: 返回文件的路径,需要注意的是这里的路径必须是绝对路径,否则会报错;

callback: 回调函数,接受一个参数

app.get('/',(req,res)=> {
    res.sendFile(`${__dirname}/public/index2.html`,function (err) {
        // console.log(arguments);
        if(err) {
            res.send('抱歉哦亲!你访问的页面不存在')
        }
        res.send()
    })
})

变为绝对路径的方法:

`${__dirname}/public/index.html`

path.join(__dirname,'./public/index.html')

1.3 json()方法

我们除了可以利用send返回JSON数据外,还可以单独使用json方法响应JSON数据,返回JSON数据,会自动设置响应头

语法:

res.json(jsonData)     // 返回json对象,一般针对ajax应用

app.get('/',(req,res) =>{
    // res.json('{"name":"why","age":18}');
    // 可以是真正的JSON数据
    // res.json(JSON.stringify({name:"aa"}))

    // 如果是对象会自动被转为JSON数据
    res.json({name:"小明",age: 8})
});

 当然了,也可以通过sendFile方法响应json文件

app.get('/',(req,res) =>{
    res.sendFile(`${__dirname}/public/index.json`,(err) => {
        if(err) {
            res.send('你访问的页面不存在');
            return;
        }
        res.send();
    })
})

1.4 redirect()重定向

重定向到指定的URL路径(浏览器地址变为设置的地址)

语法:

res.redirect("/user")

// 第一个参数也可以是状态码
       res.redirect(301, "/user")

这个方法最常见的是用于登录页面和用户页面的跳转

示例:


app.get('/user',(req,res) => {
    if(req.query.token == 'why') {
        res.sendFile(`${__dirname}/public/user.html`)
    }else{
        res.redirect('/login');
    }
})

app.get('/login',(req,res) => {
    res.sendFile(`${__dirname}/public/login.html`)
})

 当我们访问用户页面并且设置token=why时就会跳转到用户页面

当我们访问用户页面并且但不设置token时会自动跳转到login页面

1.5 download() 下载

语法:

res.download("./xxx.zip") 下载当前目录下的xxx.zip文件

//下载当前目录下的test.zip文件
app.get('/data',(req,res) => {
    res.download('./test.zip');
})

1.6 end() 结束响应的方法

结束响应顾名思义就是结束前后端之间连接的方法

res.end()

在结束响应时也可以发送数据,如:

res.end('响应结束')

 

1.7 res.jsonp()方法

该方法用来传送JSONP响应.

语法:

res.jsonp(jsonData)

jsonp返回给前端的依旧是json数据,但是前端在使用jsonp时需要路径传递上callback参数.

  • 如果不传递得到的就是json数据.
  • 如果传递了callback那么得到的就是以callback值为函数名执行

示例:

app.get("/jsonp",(req,res,next) => {
    // console.log(1)
    res.jsonp({name:'why'})
})

 

2.express请求对象

req(request) 对象包含了一次请求中的所有数据(http 请求头信息,请求参数),我们关注请求的重点就是请求参数

2.1 获取url地址中的参数(重要)

语法:

req.query

使用:

url: http://localhost:3000/user?name=why

获取参数: req.query

 

// 例如: http://localhost:3000/user?name=why
app.get("/user", (req,res) => {
    console.log(req.query);  // {name: why}
    res.send(req.query)
})

2.2 获取 post 的参数

Express中接收POST请求参数需要借助第三方的包,body-parser

语法:

req.body

//首先引入第三方的包
const bodyparser = require('body-parser');

// 拦截所有请求
// 配置body-parser模块
// extended: false ,方法内部使用querystring内置模块处理请求参数格式
// extended: true  方法内部使用第三方qs模块处理请求参数
app.use(bodyparser.urlencoded({extended: false}))
app.use(bodyparser.json())

// 还有exprss 框架提供的处理post的内置中间件
app.use(express.urlencoded())
app.use(express.json())


// 接受请求
app.post('/add', (req,res) => {
    // 请求参数
    console.log(req.body)
    res.end()
})

2.3 路由参数

语法:

req.params.参数名

app.get('/users/:id',(req,res) =>{
    console.log(req.params)
    console.log(req.params.id)
    res.end()
})

//{ id: 'why' }
// why

     在这里id是一个动态的数据,users是一个固定的路径,当我们在user下访问某个数据时,就会自动的生成{id:}这样的一个对象,我们就可以通过 req.params 访问到它.在上面的例子中,:id就是一个占位符,我们也可以给它起任何我们需要的名字,也可以接受多个占位符,具体如下

app.get('/users/:username/:age/:sex',(req,res) =>{
    console.log(req.params);
    console.log(req.params.username);
    console.log(req.params.age);
    console.log(req.params.sex);
    res.send(`姓名:${req.params.username}   
    年龄:${req.params.age}
    性别:${req.params.sex}`)
})
//{ username: 'why', age: '18', sex: '女' }
// why
// 18
// 女

 2.4 RESTful 路由风格

 所谓的路径参数就是最近比较火的RESTful路由风格

以前的操作是一个路由对应一个功能,

如果我要对同一个学生操作增删改查,就得定义如下的路由:

http://localhost:3000/getStudent?id=001    // 显示学生信息路由
http://localhost:3000/delStudent?id=001    // 删除学生信息路由
http://localhost:3000/addStudent?id=001    // 新增学生信息路由
http:/localhost:3000/updateStudent?id=001  // 修改学生信息路由

 具体代码如下(我用了postman软件来发送post请求:

const express = require('express');
const fs = require('fs');

const app = express();

// 配置post请求参数获取的中间
app.use(express.urlencoded())
app.use(express.json())

//获取学员信息
app.get('/getStudent',(req,res) =>{
    //获取get请求的参数
    // console.log(req.query);
    let {id} = req.query;
    res.sendFile(`${__dirname}/students/${id}.json`);
})

//增加学员信息
app.post('/addStudent',(req,res)=>{
    //req.body:客户端返回给服务端的信息
    console.log(req.body)
    let {id} = req.body;
    //写入信息JSON.stringify(req.body)
    fs.writeFile(`./students/${id}.json`,JSON.stringify(req.body),(err)=>{
        if(err) {
            res.send('新增学员信息失败');
            return;
        }
        res.send('新增学员信息成功');
    })
})

//修改学员信息
app.post('/updateStudent',(req,res) =>{
    let {id} = req.query;
    fs.writeFile(`./students/${id}.json`,JSON.stringify(req.body),(err)=>{
        if(err) {
            res.send('修改学员信息失败');
            return;
        }
        res.send('修改学员信息成功');
    })
    // res.send('修改学员信息')
})

//删除学员信息
app.get('/deleteStudent',(req,res) =>{
    let {id} = req.query;
    fs.unlink(`./students/${id}.json`,(err) => {
        if(err) {
            res.send('删除学员信息失败');
            return;
        }
        res.send('删除学员信息成功');
    })
    // res.send('删除学员信息')
})
//监听端口
app.listen(3000)
console.log('server start at 3000 port');

现在比较流行的是RESTful路由风格处理

简单理解就是:对于同一个学生的操作,都在同一个URL下进行,通过判断HTTP类型的不同,来决定做不同的事情

http://localhost:3000/students/001   // GET请求    访问学生信息
http://localhost:3000/students/001   // POST请求    增加学员信息
http://localhost:3000/students/001   // put请求,        更新学员信息
http://localhost:3000/students/001   // delete请求   删除学员信息

具体代码如下:

const express = require('express');
const fs = require('fs');

const app = express();

// 配置post请求参数获取的中间
app.use(express.urlencoded())
app.use(express.json())

//获取学员信息
app.get('/students',(req,res) =>{
    let {id} = req.query;
    res.sendFile(`${__dirname}/students/${id}.json`);
})

//增加学员信息
app.post('/students',(req,res)=>{
    let {id} = req.body;
    fs.writeFile(`./students/${id}.json`,JSON.stringify(req.body),(err) => {
        if(err) {
            res.send('增加学员信息失败');
            return;
        }
        res.send('增加学员信息成功');
    })
})

//修改学员信息
app.put('/students',(req,res) =>{
    let {id} = req.query;
    fs.writeFile(`./students/${id}.json`,JSON.stringify(req.body),(err) => {
        if(err) {
            res.send('修改学员信息失败');
            return;
        }
        res.send('修改学员信息成功');
    })
})

//删除学员信息
app.delete('/students',(req,res) =>{
    let {id} = req.query;
    fs.unlink(`./students/${id}.json`,(err) => {
        if(err) {
            res.send('删除学员信息失败');
            return;
        }
        res.send('删除学员信息成功');
    })
})
//监听端口
app.listen(3000)
console.log('server start at 3000 port');

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值