express|青训营笔记

74 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的的第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})
  1. 托管静态资源
  • 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同时匹配才行,按顺序匹配
  • 模块化路由
    1. 新建路由模块(新的js文件)
    2. 调用express.Router()
    3. 向路由对象上挂载具体路由(一样的挂载)
    4. 使用module.exports对象暴露路由对象
    5. 使用app.use(['/api',]Router)注册路由模块

中间件

  1. 定义一个最简单的中间间函数
const mw=function(req,res,next){
             ...
            next()//不调就终止了
        }
  1. 注册一个全局生效的中间件 app.use(mw)
  2. app.use((req,res,next)=>{...next()})
  3. 中间件的req和res是同一个对象,也就是可以在上游中间件定义属性|方法,下游使用(简化代码)
  4. 局部生效的中间件
    • 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内置中间件
    1. express.static托管静态资源
    2. express.json 解析json格式的请求体数据
    3. express.urlencodedURL-encoded格式
      • app.use(express.urlencoded({extended:false}))
    4. 这样我们可以通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 cors
  • const cors=require('cors')
  • app.use(cors)
  1. Access-Control-Allow-Origin
  • res.setHeader('Access-Control-Allow-Origin','*')
  1. Access-Control-Allow-Header
  • res.setHeader('Access-Control-Allow-Header','Content-Type,X-Custom-Header')
  1. Access-Control-Allow-Methods
  • res.setHeader('Access-Control-Allow-Methods','*')
  1. JSONP
    1. 获取客户端发过来的回调函数的名字
    2. 得到JSONP要发送的数据
    3. 根据前两步拼接一个函数调用的字符串
    4. 响应给客户端的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)
        
        })