node.js 38-51
## Express
```
1.基于node.js平台的web开发框架 类似于内置的http模块 用来创建web服务器
2.对外提供静态资源(存疑)
3.路由:客户端请求与服务器处理函数之间的映射关系
模块化路由:将路由抽离为单独的模块
app.use() 注册全局中间件
4.中间件:对请求进行预处理 本质是一个处理函数 形参中必须包含next参数 而路由处理函数只包含 req res
全局生效的中间件:请求到达后都会触发的中间件 通过调用app.use()
局部生效的中间件
5.多个中间件共享一份req res 在上游统一为req res 对象添加属性方法 供下游使用
6,。中间件的分类:
应用级别:通过app.use() app.get() app.post()绑定到app实例上的
路由级别:绑定到express.Router()实例上
错误级别:捕获异常错误 4个形参err req res next
Express内置:express.static() express.json 解析JSON格式的请求体数据 express.urlencoded 解析URL-encoded格式的请求体数据
第三方:
```
服务器基本创建
//导入
const express = require('express')
//创建
const app = express()
//路由规则
app.get('/', (req, res) => {
console.log( req.query) //可以获取url携带的查询参数
// res.send({ name: 'kk' }) //响应一个JSON对象
res.send(req.query)
})
app.post('/user', (req,res) => {
res.send('哈哈') //响应一个文本字符串
})
app.get('/user/:id/:name', (req, res) => {
//:id为传的是1 则req.params匹配为1(id名称不唯一 任意 可以有多个动态参数)
console.log(req.params) //匹配动态参数
})
//启动
app.listen(80, () => {
console.log('express server running at http://127.0.0.1:80')
})
路由模块
const express = require('express')
//创建路由对象
const router = express.Router()
//挂载具体路由
router.get('/user', (req,res) => {
res.send('kkk')
})
router.post('/', (req,res) => {
res.send('hhh')
})
//向外导出
module.exports=router
const express = require('express')
const app = express()
//导入路由模块
const router = require('./router')
//注册路由模块
app.use('/api',router) //api为访问前缀
app.listen(80, () => {
console.log('express server running at http://127.0.0.1:80')
})
中间件
const express = require('express')
const app = express()
//定义中间件
// const mw = (req,res,next) => {
// console.log('只是简单的中间件')
// next()
// }
// //全局生效的中间件
// app.use(mw)
//两部并一部 简写形式
app.use((eq,res,next) => {
console.log('只是简单的中间件')
next()
})
app.get('/', (req, res) => {
console.log('调用了这个/')
res.send('kkk')
})
app.listen(80, () => {
console.log('express server running at http://127.0.0.1:80')
})
中间件作用
const express = require('express')
const app = express()
app.use((req, res, next) => {
const time = Date.now()
//为req挂载一个属性 timer
//多个中间件共享一份req res 在上游统一为req res 对象添加属性方法 供下游使用
req.timer=time
next()
})
app.get('/', (req,res) => {
res.send('kkk'+req.timer)
})
app.post('/user', (req,res) => {
res.send('hhh'+req.timer)
})
app.listen(80, () => {
console.log('express server running at http://127.0.0.1:80')
})
局部生效的中间件
const express = require('express')
const app = express()
const mw1 = (req,res,next) => {
console.log('这是一个局部中间件')
next()
}
app.get('/', mw1, (req, res) => { //中间添加mw1 表明只能在/这个路由中使用 不会影响user这个路由
console.log('调用了/这个路由')
res.send('kkk')
})
app.post('/user', (req, res) => {
console.log('调用了user这个路由')
res.send('lll')
})
app.listen(80, () => {
console.log('express server running at http://127.0.0.1:80')
})
内置中间件
const express = require('express')
const app = express()
app.use(express.json())//通过这个中间件解析json格式数据
app.get('/', (req, res) => {
//在apipost的body raw 发送json格式请求体
console.log(req.body)//如果不配置解析json格式数据的中间件 req.body默认为undefined
res.send('kkk')
})
app.use(express.urlencoded({extended:false}))//在apipost的body x-www 发送urlencoded格式请求体
app.get('/user', (req, res) => {
console.log(req.body)//如果不配置解析json格式数据的中间件 req.body默认为undefined
res.send('aaa')
})
app.listen(80, () => {
console.log('express server running at http://127.0.0.1:80')
})
错误级别中间件
const express = require('express')
const app = express()
app.get('/', (req,res) => {
throw new Error('发生错误')
res.send('KKK')
})
//错误中间件写在路由之后
app.use((err, req, res, next) => {
console.log('发生了错误')
res.send(err.message)
})
app.listen(80, () => {
console.log('express server running at http://127.0.0.1:80')
})