目录
1.express响应对象
响应对象是指服务器想客户端响应数据的对象,包含所有要响应的内容
1.1 send方法
send方法用来想页面发送各种数据
语法:
res.send(data) 可以返回任意类型的数据
参数:要响应的内容
//普通字符串
// res.send('首页');
//JSON数据
// res.send({"name":"why",'age':18});
//普通文本
res.send(`<h2>普通文本</h2>`);
注意:不能发送数字,如果发送发送数字会被当成状态码.
- send(123),这样写会报错;
- send() 方法只能出现一次,重复无效还报错,因为send内含end()结束响应
设置状态码并返回内容可以使用如下的方法:
res.status(201).send('我就是一串字符串');
send方法的优点:
- send 方法内部会自动检测要响应内容的类型;
- send 方法会自动设置http状态码;
- 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');