1.了解express
express:基于node.js平台,快速、开放、极简的web开发框架。
express搭建服务器:
- 使用express包
- 新建一个项目文件夹
- 下载 导入 使用
npm install express --save //安装
const express = require('express') //导入
const app = express() //使用
// 配置路由
app.get('/abc', (req, res) => {
res.send('Hello World!')
})
// 监听端口
app.listen(8081, () => {
console.log('服务器监听8081端口成功!')
})
2.express的基本路由
后端路由:一个路由地址对应一个资源。当前端口请求后端路由时,后端会响应对应的资源。即使路由地址相同,但是请求方式不同也属于不同的路由。
基础路由 | 路由匹配 | 请求方式 | 其他 |
app.get('路由',中间件函数) | 路由精确匹配 | get | 路由写'*',表示匹配所有路由 |
app.post('路由',中间件函数) | 要求路由精确匹配 | post | 路由写'*',表示匹配所有路由 |
app.delete('路由',中间件函数) | 要求路由精确匹配 | delete | 路由写'*',表示匹配所有路由 |
app.all('路由',中间件函数) | 要求路由精确匹配 | 能匹配所有请求 | 路由写'*',表示匹配所有路由 |
app.use('路由',中间件函数) | 要求路由以指定路由开始,后面随意 | 只能匹配任意请求 | 路由不写,表示匹配所有路由 |
const express = require('express')
const app = express()
/*
1、app.get
请求地址:http://localhost:8081/api
请求方式:get
请求参数:不限
调用下面配置的基础路由的回调函数 (回调函数中的各个形参 叫中间件)
*/
app.get('/api', (req, res) => {
res.send('get请求路径:http://localhost:8081/api')
})
/*
2、app.post
请求地址:http://localhost:8081/api
请求方式:post
请求参数:不限
调用下面配置的基础路由的回调函数 (回调函数中的各个形参 叫中间件)
*/
app.post('/api', (req, res) => {
res.send('post请求路径:http://localhost:8081/api')
})
/*
3、app.delete
请求地址:http://localhost:8081/api
请求方式:delete
请求参数:不限
调用下面配置的基础路由的回调函数 (回调函数中的各个形参 叫中间件)
*/
app.delete('/api', (req, res) => {
res.send('delete请求路径:http://localhost:8081/api')
})
/*
4、app.all
请求地址:http://localhost:8081/api
请求方式:不限
请求参数:不限
调用下面配置的基础路由的回调函数 (回调函数中的各个形参 叫中间件)
*/
app.all('/api', (req, res) => {
res.send('all请求路径:http://localhost:8081/api')
})
/*
4、app.use
请求地址:不限
请求方式:不限
请求参数:不限
调用下面配置的基础路由的回调函数 (回调函数中的各个形参 叫中间件)
*/
app.use('/use',(req, res) => {
res.send('我是use')
})
/* app.use((req, res) => {
res.send('我是use')
}) */
// 监听端口
app.listen('8081', () => {
console.log('服务器开启成功!')
})
3.express的中间件Next
中间件函数有三个参数:
- req请求对象
- res响应对象
- next下一个中间件函数(next代表的是下一个中间件函数,调用next()会执行下一个匹配的中间件函数)
app.all('/api', (req, res, next) => {
console.log('all api')
next()
})
app.get(
'/api',
(req, res, next) => {
console.log('get api')
next()
},
(req, res, next) => {
console.log('get2 api')
}
)
app.post('/api', (req, res, next) => {
console.log('post api')
})
/*
执行顺序
如果/api匹配了多个中间件函数,先执行第一个
如果有next(),就继续执行符合请求条件的下一个中间件函数
如果没有next(),就停止
*/
4.express的中间件Req
req中间件的相关属性
req.query:可以获取get请求的查询字符串,并解析成对象
req.params:动态路由参数,并解析成对象
app.get('/api', (req, res, next) => {
// 查询字符串(参数:?name=blue&age=28)
console.log(req.query) //{}
res.send('get')
next()
})
app.get('/api/:id', (req, res) => {
// :id 就是不确定内容
console.log(req.params) //{id:xxx}
res.send('动态路由')
})
5.express的中间件Res
res中间件的相关属性
1.通过响应头给浏览器设置cookie
语法:res.cookie(key,value,{expires:'过期时间对象'})
2.发送响应主体
res.send():可以传任何格式
res.end():只能传字符串和buffer
res.json():传给前端一个json数据
res.download('把指定的绝对文件路径让浏览器下载')
3.当前文件所在文件夹的绝对路径获取方式
__dirname
const path = require('path')
app.get('/api', (req, res, next) => {
res.cookie('a', '10', {
expires: new Date(Date.now() + 3600)
})
res.send('get请求')
// res.send({name:'blue'})
// res.end({name:'blue'}) //报错
// res.json({ success: 'success' })
// res.download(path.join(__dirname, '/package.json'))
})
6.express的中间件错误处理
一般写在所有的路由配置的末尾
err:处理前面的中间件出现的错误,以免服务器瘫痪
语法:app.use((err,req,res,next)=>{})
若需要使用错误处理中间件,四个参数缺一不可
app.get('/api', (req, res) => {
console.log(a) //a is not defined
})
app.get('/api', (req, res) => {
console.log(a) //a is not defined
})
app.get('/api', (req, res) => {
console.log(a) //a is not defined
})
app.use((err, req, res, next) => {
console.log(err, 'err')
res.send({ help: '错误!' })
})
7.express的内置静态资源处理中间件
静态资源处理中间件
语法:app.use(express.static('静态资源文件夹路径'))
最好写在所有路由配置前面
const path = require('path')
app.use(express.static(path.join(__dirname, '..', 'public')))
8.post请求主体解析内置中间件
express的post请求主体解析中间件:bodyParser
若不用post请求主体解析,node服务器找不到主体是什么
语法:app.use(express.urlencoded())
// bodyParser中间件
app.use(express.urlencoded()) //express.urlencoded 解析 URL-encoded 格式的请求体数据
app.use(express.json()) //express.json 解析 JSON 格式的请求体数据
app.post('/api', (req, res) => {
console.log(req.body) //{}
res.send('post发送成功!')
})
9.express的路由中间件
接口文件router/index.js
// 引入express
const express = require('express')
// 创建express的路由实例对象
const router = express.Router()
router.get('/login', (req, res) => {
res.send('login接口')
})
router.post('/info', (req, res) => {
res.send('info接口')
})
router.get('/loginout', (req, res) => {
res.send('loginout接口')
})
module.exports = {
router
}
调用接口文件访问
const express = require('express')
const app = express()
const router = require('./router/index').router
app.use('/user', router)
app.listen('8081', () => {
console.log('服务器开启成功!')
})