这是我参与「第四届青训营 」笔记创作活动的的第8天
express
1.用express创建web服务器
npm i express
const express=require('express')
const app=express()
app.listen(80,()=>{})
2.监听get/post请求
app.get('/users',(req,res)=>{})app.post('/users(/:id/:name)',(req,res)=>{})res.send(xx)返回数据req.query获得query参数对象req.params获得params对象({id:xx,name:xx})
- 托管静态资源
app.use(express.static('./public'))- 托管多个只需要多次写上示代码,换路径
app.use('/piblic',express.static('./public'))访问时需要访问前缀 ,
nodemon(热重载)
- npm i -g nodemon
- nodemon app.js
路由
app.method(path,handler)app.get("/get",(req,res)=>{ })
- method和path同时匹配才行,按顺序匹配
- 模块化路由
- 新建路由模块(新的js文件)
- 调用express.Router()
- 向路由对象上挂载具体路由(一样的挂载)
- 使用module.exports对象暴露路由对象
- 使用
app.use(['/api',]Router)注册路由模块
中间件
- 定义一个最简单的中间间函数
const mw=function(req,res,next){
...
next()//不调就终止了
}
- 注册一个全局生效的中间件
app.use(mw) app.use((req,res,next)=>{...next()})- 中间件的req和res是同一个对象,也就是可以在上游中间件定义属性|方法,下游使用(简化代码)
- 局部生效的中间件
app.get("/get",mv,(req,res)=>{})app.get("/get",mv,mv1,(req,res)=>{})app.get("/get",[mv,mv1],(req,res)=>{})
6.注意
- 中间件一定要在路由之前
- 可以调多个中间件
- 一定要有next()
- next()之后不要再写代码
- 多个中间件共享req,res 7.分类
- 应用级别的中间件(绑定到app上)
- 路由级别的中间件(绑定到router上)
- 错误级别的中间件((err,req,res,next)=>{})(注册到所有路由之后)
- Express内置中间件
express.static托管静态资源express.json解析json格式的请求体数据express.urlencodedURL-encoded格式app.use(express.urlencoded({extended:false}))
- 这样我们可以通req.body获取传来的数据
- 第三方中间件
1.npm i body-parser
2.const parser=require("body-parser")3.`app.use(parser.urlencoded({extended:false})) - 自定义中间件
const qs=require('querystring')//pase方法可以把查询字符串解析成对象的格式 mudule.exports= function(req,res,next){ let str=''; req.on('data',(chunk)=>{ str+=chunk }) req.on('end',()=>{ req.body=qs.parse(str)//下游就可以得到 }) next() } //其他文件即可require然后app.use()
8.跨域
npm i corsconst cors=require('cors')app.use(cors)
- Access-Control-Allow-Origin
res.setHeader('Access-Control-Allow-Origin','*')
- Access-Control-Allow-Header
res.setHeader('Access-Control-Allow-Header','Content-Type,X-Custom-Header')
- Access-Control-Allow-Methods
res.setHeader('Access-Control-Allow-Methods','*')
- JSONP
- 获取客户端发过来的回调函数的名字
- 得到JSONP要发送的数据
- 根据前两步拼接一个函数调用的字符串
- 响应给客户端的script标签
app.get('/api/jsonp',(req,res)=>{ const fuc=req.query.callback const data={name:'lili',age:18} const scriptStr=`${fnc}(${JSON.stringfy(data)})` res.send(scriptStr) })