淘先锋技术网

首页 1 2 3 4 5 6 7

express

  • 二次封装 非侵入式 增强型

  • 搭建web服务器

let express = require("express")
let server = require()
server.listen(端口,地址,回调)
  • 静态资源托管

server.use(express.static("./www"))

  • 接口响应
server.get(url,(req,res,next)=>{})
server.post(url,(req,res,next)=>{})
  • req 请求体
req.query //获取地址栏数据 
req.body //获取非地址栏数据 
req.params //如果是动态接口时 监听动态的那个目录名
req.method //获取前端的提交方式
  • res 响应体
res.send() //返回给前端任意格式的数据 
res.json() //只能返回给前端json格式的数据 
res.status(404).send({error:1}) //当请求出错时返回给前端信息
res.sendFile(path.resolve("pubilc/error.html"))//渲染纯HTML文件 依赖path第三方模块 

​ 测试代码如下:

const express = require("express")

//引入中间件  body-parser (作用:增加一些功能)
const bodyParser = require("body-parser")

const path = require("path")

//创建服务器 
const app = express();

//监听端口 

app.listen(3000,"localhost",()=>{
    console.log("3000正在监听")
})

//通过app.use()  使用body-parser中间件 (作用:增加一些功能)
app.use(bodyParser())

app.get("/api/goods",(req,res)=>{
    // console.log(req.body) //依赖中间件body-parser  获取非地址栏的数据
    // console.log(req.query) //req.query 接收前端传递过来的数据 获取的是地址栏的数据
    // res.send("hello world")  //返回给前端数据 任意格式
    // res.json({a:1,b:2}) //只能返回给前端json格式的数据
    //res.status(404).send({error:1}) //请求出错 返回给前端信息 
    // res.sendFile(path.resolve('public/index.html'))//渲染纯 HTML 文件
})



//监听动态接口 :id 表示动态的目录名 
// app.get("/api/goods/:id",req=>{
//     console.log("详情...",req.params.id) //用         req.params.id 可以获取动态的接口名 
//     console.log(req.method) //req.method 可以本次请求的方式 
// })
  • jsonp 响应
server.set('jsonp callback name','cb')  //设置函数名 默认时callback
server.get('/jsonp接口',(req,res) => res.jsonp)

代码如下

app.get("/api/home",(req,res)=>{
    console.log("jsonp来的数据",req.query) //获取前端传递来的参数
    res.jsonp({err:0,data:{a:1,b:2}}) //返回一个结果,调用客户端传递来的callback=jsonp_XXXXX方法调用执行,传递参数给他
})

//具体响应流程
前端发送请求(ajax jsonp) -> 后端接收请求(根据前端传递来的数据 向数据库获取数据 然后用res.jsonp返回给前端数据 -> 前端接收数据)  
  • 处理一部分接口

共有业务逻辑 在一起给处理了
server.all(“admin/*”,(req,res,next)=>{})
all 不管时get 还是post 都可以响应
若下面还有接口响应 需要next 延续

代码如下

app.get("/api/*",(req,res,next)=>{
    console.log("a,b的所有的公共的业务逻辑...")
    next()  //使得后续得以运行
})

app.get("/api/a/*",(req,res,next)=>{
    console.log("/api/a的数据请求....")
    next()
})
app.get("/api/a/aa",(req,res)=>{
    console.log("/api/a/aa的数据请求....")
})
  • use
默认use不写地址就是截获了根路径   app.use("/",callback)
app.use((req,res,next)=>{
    console.log("进入app.use了哦...")
    next() //向下延续
})

app.use("/api/*",(req,res,next)=>{  //类似 all   
    console.log("进入app.use了哦...")
    next() //向下延续
})
  • next 管道函数
app.use((req,res,next)=>{
    req.query = "abcdefg"
    next()
})

app.get("/api/home",(req,res,next)=>{
   //可以获取上面设置的req.query 
    console.log("进入了/api/home....",req.query)
})
  • 中间件 (如body-parser)

中间件 需要依赖use来使用
app.use(bodyParser())

举例

npm i body-parser -S //安装包
let bodyParser=require('body-parser')//引入中间件
server.use(bodyParser())//安装中间件
  • 后端跳转

res.redirect(url)

let abc;
app.get("/api/old",(req,res,next)=>{
   //res.redirect(地址)
   abc = req.query
   res.redirect("http://localhost:3000/api/new") //后端跳转
})

app.get("/api/new",(req,res,next)=>{
    console.log("进来了哦.....",abc)
    res.end()
}) */
  • 封装body-parser中间件
//bdparser.js  文件 (封装)
const querystring = require("querystring");

module.exports = {
    urlencoded:(options) => {
        options = options || {}
        options.limit = options.limit || 102400
        return (req,res,next) => {
            let str = " "
            req.on("data",chunk => str+=chunk)
            req.on("end",()=>{
                if(str.length>options.limit){
                    throw new Error()
                }else{
                req.body = querystring.parse(str)
                    next()
                }

            })
        }
    }
}



//body-parser.js文件  (引用上面的封装)

const express = require("express");

const bodyParser = require("./middleware/bdParser.js")

const app = express();

app.listen(3000)

// app.use(bodyParser())
app.use(bodyParser.urlencoded({
    limit:102400  //设置获取前端数据的长度
}))

app.post("/api/old",(req,res,next) => {
    console.log(req.body)
    res.end()
})



cookie-session

  • 思想

1、客户端用户名跟密码请求登录
2、服务端收到请求,去库验证用户名与密码
3、验证成功后,服务端种一个cookie或发一个字符到客户端,同时服务器保留一份session
4、客户端收到 响应 以后可以把收到的字符存到cookie
5、客户端每次向服务端请求资源的cookie会自动携带
6、服务端收到请求,然后去验证cookie和session,如果验证成功,就向客户端返回请求的库数据

  • 安装引入cookie-session
let cookieSession = require("cookie-session")
  • 配置中间件
app.use(cookieSession({
	name:"保存到服务器的session的名字",
	keys:[必选参数,代表加密层级],
	maxAge:1000 //保留cookie的时间
}))
  • 设置客户端cookie 及 备份服务端session
req.session.key = value
  • 读cookie对比session
req.session.key  返回true

具体操作代码如下

const express = require("express")

const cookieSession = require("cookie-session")

const app = express();

//静态资源托管
app.use(express.static("./public"))


app.listen(3000,()=>{
    console.log("正在监听3000端口")
})


//配置中间件
app.use(cookieSession({
    name:"myCookie",
    keys:['aa','bb','cc'],
    // maxAge:1000*300
}))


//验用户身份 
app.get("/api/login",(req,res)=>{
    //1.验证客户端传递来的用户名和密码和数据库中密码是否一致 
    //2.给客户端设置cookie 并且同时r服务端备份session
    req.session.username ="geng"
    //后端设置完cookie后 就可以返回给前端数据了 
    res.send({
        err:0,
        msg:"登录成功"
    })
})

//验证用户身份 
app.get("/api/user",(req,res)=>{
    const pass = req.session.username; //返回布尔值 若为true说明用户在登录状态
    if(pass){
        res.send({
            err:0,
            data:"ok"
        })
    }else{
        res.send({
            err:1,
            data:"用户未登录"
        })
    }
    res.end()
})

//注销登录 
app.get("/api/logout",(req,res)=>{
    //删除服务端session 和客户端的cookie
    req.session.username = undefined
    res.end()
})