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()
})