【node进阶】深度解析Koa框架---路由|静态资源|获取请求参数

news2025/8/3 4:13:13

✅ 作者简介:一名普通本科大三的学生,致力于提高前端开发能力
✨ 个人主页:前端小白在前进的主页
🔥 系列专栏 : node.js学习专栏
⭐️ 个人社区 : 个人交流社区
🍀 学习格言: ☀️ 打不倒你的会使你更强!☀️
💯 刷题网站:这段时间有许多的小伙伴在问有没有什么好的刷题网站,博主在这里给大家推荐一款刷题网站:👉点击访问牛客网👈牛客网支持多种编程语言的学习,各大互联网大厂面试真题,从基础到拔高,快来体验一下吧!


在这里插入图片描述


🔥前言

上文中我们已经对koa框架有了一个简单的理解,并且也懂得了koa框架的优点和不足,同时在koa框架中路由的使用、静态资源的访问、获取请求的参数都有了一定的改变,该文章将讲述这三点!

📃目录

  • 路由
    • koa路由的基本使用
    • router.allowedMethods作用
    • 请求方式
    • 拆分路由
    • 路由前缀
    • 路由重定向
  • 静态资源
  • 获取请求参数
    • get参数
    • post参数
  • 小结

路由

Koa框架中与Express的区别在这里也有一个很大的展现。在Express框架中路由模块是内置模块,而在Koa中,路由模块非内置模块,需要单独的去下载。

koa路由的基本使用

安装Koa框架路由模块(koa-router):

npm i koa-router

安装成功后进行引用:

const Koa = require("koa")
const Router = require("koa-router")

const app = new Koa()
const router = new Router()

router.post("/list",(ctx)=>{
    ctx.body=["111","222","333"]
})
app.use(router.routes()).use(router.allowedMethods())
app.listen(3000)

通过以上的代码可以看出来,在koa框架中需要用到关键字new来实例化一个对象,才能进行调用。在应用级中间件中有一个方法router.routes(),它的作用是将路由对象中所有的路由模块都挂载成为应用级中间件


router.allowedMethods作用

在上方的代码中大家还看到了不认识的方法router.allowedMethods(),router.allowedMethods()中间件,主要用于 405 Method Not Allowed 这个状态码相关。
如果不加这个中间件,如果接口是get请求而前端使用post请求,会返回 404 状态码,接口未定义。如果加了这个中间件,这种情况时,会返回405 Method Not Allowed提示 request method 不匹配,并在响应头返回接口支持的请求方法,更有利于调试

例如: 我们定义一个 /list 接口,他需要使用post请求方法。这里我们先通过get方法来请求这个接口试试。

const koa = require('koa');
const Router = require('koa-router')
 
const app = new koa()
const router = new Router()
 
router.post('/list', ctx => {
  ctx.body = ["111","222","333"]
})
 
app.use(router.routes()).use(router.allowedMethods())
 
app.listen('3000', () => {
  console.log('server listen on 3000 port')
})

在这里插入图片描述
我们通过network查看后该接口报了405 Method Not Allowed的错误,在告诉我们该方法不被允许,并且提示我们Allow:POST,允许post方法。这样的话可以很方便的帮助我们开发,寻找错误更加高效。


请求方式

Koa-router 请求方式: getputpostpatchdeletedel ,而使用方法就是 router.方式() ,比如 router.get() router.post() 。而 router.all() 会匹配所有的请求方法。

const Koa = require("koa")
const Router = require("koa-router")

const app = new Koa()
const router = new Router()

router.get("/user",(ctx)=>{
    ctx.body=["aaa","bbb","ccc"]
})
router.put("/user/:id",(ctx)=>{
    ctx.body={ok:1,info:"put user success"}
})
router.post("/user",(ctx)=>{
    ctx.body={ok:1,info:"user post success"}
})
router.del("/user/:id",(ctx)=>{
    ctx.body={ok:1,info:"user del success"}
})


app.use(router.routes()).use(router.allowedMethods())
app.listen(3000)

我们在这里使用postman测试其中一个方式即可:
在这里插入图片描述


拆分路由

如果我们书写了很多个路由接口,都写到一个js文件中,未免非常的不合理,Koa框架与express框架一样,可以进行路由拆分

在这里我们通过一个demo展示:

  • demo结构
    在这里插入图片描述

  • user.js路由文件

    const Router= require('koa-router')
    const router = new Router()
    //路由中间件
    router.post('/',(ctx,next)=>{
        console.log(ctx.request.body);  //获取前端传来的参数
        ctx.body = {
            ok : 1,
            info : "add user success"
        }
    })
    //获取信息
    router.get('/',(ctx,next)=>{
        //获取前端传来的数据
        console.log(ctx.query,ctx.querystring);
        ctx.body = ['aaa','vvv','ccc']
    })
    
    router.put('/:id',(ctx,next)=>{
        console.log(ctx.params);  //获取动态路由id
        ctx.body = {
            ok : 1,
            info : "put user success"
        }
    })
    router.delete('/:id',(ctx,next)=>{
        ctx.body = {
            ok : 1,
            info : "delete user success"
        }
    })
    
    module.exports = router
    
  • home.js路由文件

    const Router= require('koa-router')
    const router = new Router()
    
    //获取信息
    router.get('/',(ctx,next)=>{
        ctx.body = `
        <html>
            <h1>home页面</h1>
        </html>
        `
    })
    
    module.exports = router
    
  • list.js路由文件

    const Router= require('koa-router')
    const router = new Router()
    
    //路由中间件
    router.post('/',(ctx,next)=>{
        ctx.body = {
            ok : 1,
            info : "add list success"
        }
    })
    //获取信息
    router.get('/',(ctx,next)=>{
        ctx.body = ['111','222','333']
    })
    
    router.put('/:id',(ctx,next)=>{
        console.log(ctx.params);  //获取动态路由id
        ctx.body = {
            ok : 1,
            info : "put list success"
        }
    })
    router.delete('/:id',(ctx,next)=>{
        ctx.body = {
            ok : 1,
            info : "delete list success"
        }
    })
    
    module.exports = router
    
  • 路由集合文件(index.js 注意: 这个文件是routes文件夹里的)

    const Router = require('koa-router')
    const userRouter = require('./user')
    const listRouter = require('./list')
    const homeRouter = require('./home.js')
    const router = new Router()
    
    router.use("/user",userRouter.routes(),userRouter.allowedMethods())
    router.use('/list',listRouter.routes(),listRouter.allowedMethods())
    router.use('/home',homeRouter.routes(),listRouter.allowedMethods())
    
    module.exports = router
    
  • 项目入口文件(index.js)

    const Koa = require('koa')
    const app = new Koa(
    
    //先注册路由级组件
    const router = require('./routes')  //在这里会默认访问routes文件夹下的index.js文件
    //应用级组件
    
    //将router里所有的路由注册成应用级别的中间件
    app.use(router.routes()).use(router.allowedMethods())
    
    app.listen(3000)
    

路由前缀

const Router = require('koa-router')
const userRouter = require('./user')
const listRouter = require('./list')
const homeRouter = require('./home.js')
const router = new Router()

//统一加前缀
router.prefix("/api")

router.use("/user",userRouter.routes(),userRouter.allowedMethods())
router.use('/list',listRouter.routes(),listRouter.allowedMethods())
router.use('/home',homeRouter.routes(),listRouter.allowedMethods())

module.exports = router

直接添加一个方法router.prefix()即可,这样的话就可以添加你的自定义前缀了。


路由重定向

const Router = require('koa-router')
const userRouter = require('./user')
const listRouter = require('./list')
const homeRouter = require('./home.js')
const router = new Router()

router.use("/user",userRouter.routes(),userRouter.allowedMethods())
router.use('/list',listRouter.routes(),listRouter.allowedMethods())
router.use('/home',homeRouter.routes(),listRouter.allowedMethods())
//重定向
//写法1 
router.redirect('/', '/home');
//写法2
router.get("/",(ctx)=>{
    ctx.redirect("/home")
})

module.exports = router

使用方法router.redirect()即可,在这里我们访问http://localhost:3000/便会自动定位到http://localhost:3000/home页面中去。


静态资源

安装koa-static中间件:

npm i koa-static

示例代码如下:

const Koa = require('koa')
const path = require('path')
const static = require('koa-static')

const app = new Koa()

app.use(static(
  path.join( __dirname,  "public")
))


app.use( async ( ctx ) => {
  ctx.body = 'hello world'
})

app.listen(3000, () => {
  console.log('[demo] static-use-middleware is starting at port 3000')
})

获取请求参数

get参数

在koa中,获取GET请求数据源头是koa中request对象中的query方法或querystring方法,query返回的是格式化好的参数对象,querystring返回的是请求字符串,由于ctx对request的API有直接引用的方式,所以获取GET请求数据有两个途径。

  • 从上下文中直接获取 请求对象ctx.query,返回如 { a:1, b:2 }
    请求字符串 ctx.querystring,返回如 a=1&b=2
  • 从上下文的request对象中获取 请求对象ctx.request.query,返回如{ a:1, b:2 }
    请求字符串 ctx.request.querystring,返回如 a=1&b=2

补充:
获取动态路由的参数,执行请求对象: ctx.params即可!


post参数

对于POST请求的处理,koa-bodyparser中间件可以把koa2上下文的formData数据解析到ctx.request.body中。

安装koa-bodyparser中间件:

npm i koa-bodyparser

使用示例:

const Koa = require('koa')
const app = new Koa()
const bodyParser = require('koa-bodyparser')
//先注册路由级组件
const router = require('./routes')
//应用级组件
//将router里所有的路由注册成应用级别的中间件
app.use(bodyParser())  //获取前端传来的post参数
app.use(router.routes()).use(router.allowedMethods())

app.listen(3000)

小结

本篇文章讲解了koa框架中的路由、静态资源、获取请求参数,接下来的文章将对之前express框架中的知识进行“Koa化”,同时博主已经准备进行全栈项目的开发练手了,项目基于vue(2和3还没有想好) + Element ui + node.js + mysql开发,希望大家后期可以持续关注哦!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/15956.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

创建自己的函数库

创建自己的函数库前言一、什么是STM32标准函数库1.定义&#xff1a;2.作用&#xff1a;3.对比&#xff1a;二、构建库函数1.修改寄存器地址封装2.定义访问的结构体指针和引脚3.创建封装函数3.1创建拉低引脚函数3.2创建引脚初始化函数总结前言 回顾一下&#xff0c;前面点亮led…

世界儿童日,周大福真诚关爱儿童成长

守护童心 呵护成长 周大福秉持着“用真诚让幸福永恒”的企业理念&#xff0c;百周年承诺“以人为本”。以爱和关怀凝聚社会力量&#xff0c;提倡社会共融&#xff0c;缔造可持续未来。 梦想家祝福 2021年周大福珠宝集团与美丽中国&#xff0c;携手打造“家源于此”项目。于2…

podman-compose 有前途吗?

文章目录1. 前言2. Docker Compose 和 Podman Compose 的历史3. 未来4. 观点5. 安装5.1 pip3 安装5.2 python 安装5.3 dnf 安装6. 示例1. 前言 虽然 Kubernetes 已经发展成为容器编排的主导者&#xff0c;但人们仍然对管理较小规模的容器&#xff08;通常是单个系统&#xff0…

centos7—安装mysql

文章目录1.1 卸载MariaDB1.2 官网下载包文件1.3 解压安装包1.4 安装相关的Mysql服务1.5 开启Mysql服务1.1 卸载MariaDB 由于centOS7中默认安装了MariaDB,需要先进行卸载 rpm -qa | grep -i mariadb #查找本地mariadb rpm -e --nodeps mariadb-libs-5.5.68-1.el7.aarch64 #这个…

nuxt 如何生成sitemap.xml 动静态站点地图

前言 sitemap.xml的作用是将我们网站的所有页面都被SEO&#xff08;浏览器搜索引擎&#xff09;收录&#xff0c;我们网站的内容更容易被用户搜到&#xff0c;同时增加我们的网站的知名度&#xff0c;排名更靠前。简言之就是用技术做网站推广&#xff0c;所以对于网站推广sitem…

JVM【类加载与GC垃圾回收机制】

JVM【类加载与GC垃圾回收机制】&#x1f34e;一.JVM&#x1f352;1.1JVM简介&#x1f352;1.2JVM执行流程&#x1f34e;二.JVM运行时数据区&#x1f352;2.1 程序计数器(线程私有)&#x1f352;2.2 栈(线程私有)&#x1f352;2.3 堆(线程共享)&#x1f352;2.4 方法区(线程共享…

Matlab图像处理基础(part 1)

目录 0. 概要 1. 图像表示 Image Representation 1.1 图像格式 Image format 1.2 图像分辨率 resolution of image 1.3 图像的编码 1.4 Matlab图像加载、显示和保存 1.5 Image Information 1.6 图像格式转换 1.7 其它类型的像素 1.8 像素数值格式 1.9 图像数据的访问…

vue实现防抖函数、节流函数,全局使用【输入框、按钮】

博主介绍 &#x1f4e2;点击下列内容可跳转对应的界面&#xff0c;查看更多精彩内容&#xff01; &#x1f34e;主页&#xff1a;水香木鱼 &#x1f34d;专栏&#xff1a;后台管理系统 文章目录 简介&#xff1a;这是一篇有关【vue实现防抖函数、节流函数&#xff0c;全局使用…

第一章《初学者问题大集合》第4节:Java程序是如何执行的

想要学好Java编程,就必须先弄清楚Java程序是如何执行的。首先来解释一个最基本的概念:什么是程序?把你想让计算机做的事情用编程语言一条条列出,这个由多条编程语言所组成的“代码序列”就是程序。 那么Java程序又是如何运行的呢?这个过程如图1-1所示。 图1-1 Java程序运…

C语言小游戏之三子棋(井字棋)(1.5w字超详细讲解)

hello&#xff0c;csdn的伙伴们&#xff0c;大家好&#xff0c;我们已经学习到了分支与循环&#xff0c;函数&#xff0c;数组这三大块知识&#xff0c;那么我们现在就可以尝试综合运用前面所学的知识&#xff0c;来完成一个简单的小游戏-----三子棋&#xff08;井字棋&#xf…

Allegro DFM Ravel Rule工具使用指导书

Allegro DFM Ravel Rule工具使用指导书 Allegro任何一个版本都支持DFM Ravel Rule检查,即便是166的版本 打开后的界面如下所示 可以检查项目 测试点,阻焊,走线,丝印,过孔,milling,装配,outline相关的DFM检查 可以让违反规则的设计处以DRC的形式报出来 避免加工问题 …

基于数字孪生打造智慧园区运营平台,助力园区数字化转型

在各行各业数字化转型的浪潮中&#xff0c;园区也在经历数字化转型发展&#xff0c;从传统园区向智慧园区不断演进。传统园区缺乏系统性规划&#xff0c;基于单点功能建设&#xff0c;存在系统孤立、管理粗放且服务不足等问题&#xff0c;难以满足人们日益增长的多样化需求。在…

第四章. Pandas进阶—数据合并

第四章. Pandas进阶 4.6 数据合并 数据合并主要使用的是Merge方法和Concat方法 1.数据合并(merge函数) 1).语法&#xff1a; pandas.merge(right,how‘inner’, on“None”, left_on“None”, right_on“None”, left_indexFalse, right_indexFalse... )参数说明: right&…

甘露糖-聚乙二醇-马来酰亚胺 mannose-PEG-MAL 马来酰亚胺-PEG-甘露糖

甘露糖-聚乙二醇-马来酰亚胺 mannose-PEG-MAL 马来酰亚胺-PEG-甘露糖&#xff0c;溶于大部分有机溶剂&#xff0c;如&#xff1a;DCM、DMF、DMSO、THF等等。在水中有很好的溶解性 中文名称&#xff1a;甘露糖-马来酰亚胺 英文名称&#xff1a;mannose-MAL 别称&#xff1a;…

【LeetCode 每日一题】53. 最大子数组和

01 题目描述 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 02 示例 示例1&#xff1a; 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5…

从 React 源码彻底搞懂 Ref 的全部 api

ref 是 React 里常用的特性&#xff0c;我们会用它来拿到 dom 的引用。 它一般是这么用的&#xff1a; 函数组件里用 useRef&#xff1a; import React, { useRef, useEffect } from "react";export default function App() {const inputRef useRef();useEffect(…

几乎涵盖了近半年90%的Java面试题,可以肝起来了

前言 很多人在问&#xff1a;八股文还有必要背吗&#xff1f; 近半年来大家听到的、用到的不少&#xff0c;带来的争议也不断。 有人奉为面试神器&#xff0c;全文背诵。有人觉得八股文铺天盖地实际作用不大&#xff0c;还害人不浅… 我觉得不是背不背八股文的问题&#xff0c…

【机器学习并行计算】2 parameter server参数服务器

使用ps实现异步梯度下降。 14年提出的。 异步 vs 同步 可以看出异步运行效率非常高。 异步梯度下降的流程 ps架构流程 worker&#xff1a; 首先从参数服务器拉取最新的参数&#xff1b;然后用自己节点上的数据计算梯度&#xff1b;最后把梯度推给参数服务器参数服务器&#xf…

最快速的文件传输软件,解析镭速文件传输软件

想到每天都需要进行文件传输&#xff0c;就会烦躁&#xff0c;要是有一夸最快速的文件传输软件的话&#xff0c;这样就可以节省大量的时间了&#xff0c;那么针对于用户的这一个需求&#xff0c;我们来介绍一下镭速的文件传输软件&#xff0c;看是否是那么快&#xff0c;快到你…

无监督端到端框架:IVIF

VIF-Net: An Unsupervised Framework for Infrared and Visible Image Fusion &#xff08; VIF-Net: 红外和可见光图像融合的无监督框架&#xff09; &#xff08;本文理解上的难易程度&#xff1a;易&#xff09; 在本文中&#xff0c;我们提出了一种用于红外和可见图像融合…