Express
基于node.js的web开发框架
是基于node.js中的http内置模块进一步封装出来的
可做web网站服务器、API接口服务器
一、安装
npm i express@4.17.1
二、创建最基本服务器
①req.query
②req.params
//导入模块
const express=require('express')
//创建web服务
const app=express()
//1.监听客户端的GET和POST请求,并向客户端响应
app.get('/user',(req,res)=>{
res.send('/user的get请求')
})
app.post('/user',(req,res)=>{
res.send({name:'xxxx',age:12})
})
//2.客户端传递参数,可用req.query打印
app.get('/',(req,res)=>{
console.log(req.query);
res.send(req.query)
})
//3.动态参数req.params
app.get('/:id',(req,res)=>{
res.send(req.params)
})
//启动web服务器
app.listen(8080,()=>{
console.log('express server running at http://127.0.0.1:8080');
})
三、托管静态资源express.static('xxxxx')
//挂载
app.use(express.static('login'))
//挂载访问前缀
app.use('/public',express.static('login'))
四、Express路由
在express中,路由指的是客户端的请求与服务器处理函数之间的映射关系。
Express中的路由分3部分
app.METHOD(PATH,HANDLER) 请求类型、请求地址、处理函数
路由模块.js
//路由模块.js
//导入模块
const express=require('express')
//创建路由对象
const router=express.Router()
//挂载具体路由
router.get('/user',(req,res)=>{
res.send('user')
})
//向外导出路由对象
module.exports=router
导入路由模块.js
//导入路由模块.js
const express=require('express')
const app=express()
//导入路由模块
const router=require('./08express路由模块')
//注册路由模块
app.use(router)//添加访问前缀app.use('/api',router)
app.listen(8080,()=>{
console.log('http://127.0.0.1:8080');
})
五、Express中间件
应用级别中间件、路由级别中间件、错误级别的中间件
next是判断是否中间件的标志
//定义一个简单的中间件
const mw=(req,res,next)=>{
console.log('这是一个中间件')
//把流转关系,转交给下一个中间件或路由
next()
}
//全局生效中间件
app.use(mw)
①全局生效后,每次客户端发起请求都会调用一次中间件(不是一定要全局生效的)
②定义多个
const express=require('express')
const app=express()
const mw1=(req,res,next)=>{
console.log('1');
next()
}
const mw2=(req,res,next)=>{
console.log('2');
next()
}
app.use(mw1,mw2)
app.use((req,res,next)=>{
console.log('3');
next()
})
app.get('/',(req,res)=>{
res.send('GET')
})
app.listen(8080,()=>{
console.log('http://127.0.0.1:8080');
})
③局部生效
const mw1=(req,res,next)=>{
console.log('这是一个中间件')
//把流转关系,转交给下一个中间件或路由
next()
}
app.get('/',mw1,(req,res)=>{
res.send('xxxxxxxxx')
})
④错误级别的中间件
防止程序的崩溃
app.get('/user',(req,res)=>{
throw new Error('服务器内部发生了错误')
res.send('UESER GET')
})
app.use((err,req,res,next)=>{
console.log('发生了错误'+err.message);
res.send('ERROR '+err.message)
})
⑤内置中间件
express.static快速托管静态资源(html、css、图片等)
express.json解析JSON格式
express.urlencoded解析URL-encoded
⑥自定义中间件
六、使用Express写接口
API接口
//api.js
const express=require('express')
const router=express.Router()
//暴露出去
module.exports=router
//调用.js
const router=require(./api.js)
app.use('/api',router)
apirouter.js
const express=require('express')
const router=express.Router()
router.get('/get',(req,res)=>{
const query=req.query
res.send({
status:0,
msg:'GETqingqiuchengg',
data:query
})
})
//要配置解析表单数据的中间件express.urlencoded,才能拿到数据
router.post('/post',(req,res)=>{
const body=req.body
res.send({
status:0,
msg:'POSTqingqiuchengg',
data:body
})
})
module.exports=router
api.js
const express=require('express')
const app=express()
const router=require('./12apiRouter')
app.use(express.urlencoded({extended:false}))
app.use('/api',router)
app.listen(8080,()=>{
console.log('http://127.0.0.1:8080');
})
跨域问题:采用CORS解决
npm i cors
require进去,app.use(cors())调用
注意:配置cors要写在路由之前
①三个响应头
②简单请求、预检请求