本次内容主要讲解koa框架相关内容
koa框架的下载
npm install koa
koa初体验(hello world)
//引入koa模块
const koa = require("koa");
//koa必须通过实例化方式创建对象
const app = new koa();
//注册中间件
//ctx是context的缩写,也就是上下文 next表示是否放行
app.use(async (ctx,next)=>{
// ctx.body="hello koa2" 这里的ctx.body就是把ctx.response.body给省略了
ctx.response.body={name:"章北海",sign:"自然选择,前进四"}//返回json数据到前端
})
app.listen(3000,()=>{
console.log("服务器已启动")
})
Context对象
在koa中将req和res两个对象合并为一个context对象,可以通过这个context对象来操作req和res.
通常我们会把context对象简写为ctx作为函数参数
koa路由
koa和express不同,他的路由模块被放到另一个模块中,需要通过npm下载才能使用koa路由
npm install koa-router
koa路由使用
//引入koa模块
const koa = require("koa");
const app = new koa()
//引入koa路由模块
const Router = require("koa-router")
//和koa模块一样,路由也要通过实例化对象的方式使用
const router = new Router();
router.get("/", (ctx) => {
ctx.body = ["111", "222", "333"]
})
//注意:这里需要配置路由的中间件:router.routes()
app.use(router.routes()).use(router.allowedMethods())
app.listen(3000, () => {
console.log("服务器已启动")
})
虽然我们实现了路由效果,但是后期会有非常多的接口要写,所以我们需要将每一个功能的路由都提到一个文件中
router.js
const Router=require("koa-router")
const router=new Router()
router.get("/",(ctx)=>{
ctx.body={ok:1}
})
//导出router模块
module.exports=router
index.js
//引入koa模块
const koa = require("koa");
const app = new koa()
const Router = require("koa-router")
const rt = new Router()
//导入router.js文件
const router = require("./router.js")
//注册路由级中间件
rt.use("/user", router.routes(), router.allowedMethods())
//应用级
app.use(rt.routes())
app.use(rt.allowedMethods())
app.listen(3000, () => {
console.log("服务器已启动")
})
koa静态资源
koa静态资源和路由一样,也是需要下载的
npm install koa-static
静态托管具体代码操作如下:
//引入koa模块
const koa = require("koa");
const app = new koa()
//引入koa静态托管模块
const staticKoa = require("koa-static")
//注册中间件
app.use(staticKoa("./public"))
app.listen(3000, () => {
console.log("服务器已启动")
})
koa的session和cookie操作
cookie
koa提供了从上下文直接读取写入ookie的方法
- ctx.cookies.get(name,[options])读取上下文请求中的cookie
- ctx.cookies.set(name,[options])写入上下文请求中的cookie
session
下载koa-session-minimal模块
npm install koa-session-minimal
具体session用法如下:
//引入koa模块
const koa = require("koa");
const app = new koa()
const Router = require("koa-router")
const router = new Router();
//引入模块
const session = require("koa-session-minimal")
//注册中间件
app.use(session({
key: "session_name", //设置session的key,也就是名字
cookie: {
maxAge: 1000 * 60 //设置session的最大时限
}
}))
router.get("/", (ctx) => {
//将数据存入session中
ctx.session.user = {username: "张三"}
ctx.body = {ok: 1}
})
router.get("/testsession", (ctx) => {
//ctx.session获取指定session
if (ctx.session.user) {
ctx.body = "session存在"
} else {
ctx.body = "sessino不存在"
}
})
app.use(router.routes()).use(router.allowedMethods())
app.listen(3000, () => {
console.log("服务器已启动")
})
koa的JWT用法
const koa = require("koa")
//和express一样,引入jsonwebtoken
const jwt = require("jsonwebtoken")
const app = new koa()
const cors = require("@koa/cors")
const Router = require("koa-router")
const router = new Router();
const secret = "abcde123!@#"
app.use(cors())
router.get("/generate", (ctx) => {
//生成jwt
const sign = jwt.sign({username: "张三"}, secret, {expiresIn: "1h"});
ctx.body = {jwt: sign}
})
router.get("/getData", (ctx) => {
if (ctx.headers.authorization) {
ctx.body = jwt.verify(ctx.headers.authorization, secret)
} else {
ctx.body = "未检测到jwt"
}
})
app.use(router.routes()).use(router.allowedMethods())
app.listen(3000)
jwt多用于前后端分离项目。
案例
使用前后端分离架构来实现token生成与token解析
前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<button id="sub">点我</button>
<button id="sub2">点我2</button>
<script src="axios.js"></script>
<script>
const sub = document.querySelector("#sub");
const sub2 = document.querySelector("#sub2");
//这里是创建一个请求拦截器,用于请求发送前拦截请求将token添加到请求头中
axios.interceptors.request.use((config) => {
let token = localStorage.getItem("session")
if (token) {
//如果token存在,就将token传到后端
config.headers.authorization = token
return config
}
})
//点击按钮1生成token
sub.onclick = function () {
axios.get("http://localhost:3000/generate", {
header: {"Content-Type": "application/json"}
}).then(res => {
console.log(res)
localStorage.setItem("session", res.data.jwt)
})
}
//点击按钮2解析token
sub2.onclick = function () {
axios.get("http://localhost:3000/getData", {
header: {
"Content-Type": "application/json"
}
}).then(res => {
console.log(res)
})
}
</script>
</body>
</html>
后端
const koa = require("koa")
//和express一样,引入jsonwebtoken
const jwt = require("jsonwebtoken")
const app = new koa()
const cors = require("@koa/cors")
const Router = require("koa-router")
const router = new Router();
const secret = "abcde123!@#"
app.use(cors())
router.get("/generate", (ctx) => {
//生成jwt
const sign = jwt.sign({username: "张三"}, secret, {expiresIn: "1h"});
ctx.body = {jwt: sign}
})
router.get("/getData", (ctx) => {
if (ctx.headers.authorization) {
ctx.body = jwt.verify(ctx.headers.authorization, secret)
} else {
ctx.body = "未检测到jwt"
}
})
app.use(router.routes()).use(router.allowedMethods())
app.listen(3000)
koa跨域问题
下载@koa/cors模块
npm install @koa/cors
具体配置如下:
const cors = require("@koa/cors")
app.use(cors())
koa文件上传
下载@koa/multer multer模块
npm install @koa/multer multer
具体使用
const koa = require("koa")
//和express一样,引入jsonwebtoken
const app = new koa()
const cors = require("@koa/cors")
const Router = require("koa-router")
const router = new Router();
const multer = require("@koa/multer")
//指定文件下载的目录
const upload = multer({dest: "./public"})
app.use(cors())
//用法与express的用法一致,就是需要将导入的包从multer变为@koa/multer,除此之外没有任何变化
router.get("/getData", upload.single("avatar"), (ctx) => {
ctx.body = "ok"
})
app.use(router.routes()).use(router.allowedMethods())
app.listen(3000)
以上就是koa框架相关的内容,欢迎各位评论教导,如果觉得文章还不错或者有什么地方不懂的,欢迎留言提问点赞🧡🤞🤞🤞🧡