Nodejs零基础教程(七)

本次内容主要讲解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框架相关的内容,欢迎各位评论教导,如果觉得文章还不错或者有什么地方不懂的,欢迎留言提问点赞🧡🤞🤞🤞🧡 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值