一个关于koa-router路由全匹配问题

发布于 2022-09-05 15:47:46 字数 680 浏览 14 评论 0

最近想使用koa给公司做个网站(刚接触koa),在使用路由的时候发现koa-router中的router.use()并不能像express的路由中router.use()一样,匹配当前层级及以后层级路由,例如

express 中

router.use('/user',adminAuth,userRouter)

会自动为/user以后的所有路由应用登录验证函数aminAuth

koa-router中

router.use('/user',adminAuth,userRouter)

只会为/user匹配使用adminAuth,之后的/user/:id,/user/....等都不会执行adminAuth

想到了koa的app.use是一个全局匹配的函数,于是就使用了app.use()

app.use(async (ctx,next)=>{
    if(ctx.url.indexOf('/user')>=0){
        adminAuth()
    }
    await next()
})

可以实现为所有/user路由登录验证,但是觉得那里不对

注:多个路由/user,/api/等使用的switch代替if

希望各位能指点下,刚接触koa,谢谢

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

别再吹冷风 2022-09-12 15:47:47

你的写法是这样的吗?.use.verb是定义在同一个router实例下的吗

// app.js
const app = require("koa")
const router = require("koa-router")
router.use('/user',middleware)
router.get('/user/:id')
router.get('/user/xxxxx')
app.use(router.routes())
app.use(router.allowedMethods())

这样子没问题的,你搞得我都快怀疑人生了.
clipboard.png

红玫瑰 2022-09-12 15:47:47

封装后的函数如下:
望批评指正

//
//
// 自定义koa-router路由全匹配函数

// 定义url数组和fun函数
let urlArr = []
let funArr = []

// 定义路由中间件全配函数
function mUse(){
    let meddile = Array.prototype.slice.call(arguments)
    urlArr.push(meddile[0])
    funArr.push(meddile.slice(1,meddile.length))
}

// 寻找匹配路由
function urlGet(obj) {
    let ctx = obj.ctx
    let next = obj.next
    for(let i=0;i<urlArr.length;i++){
        if(ctx.url.indexOf(urlArr[i])===0){
            funAction(funArr[i],ctx,next)
        }
    }
}

// 执行中间件函数
function  funAction(funArr,ctx,next) {
    if(funArr.length>1){
        for(let i=0;i<funArr.length;i++){
            funArr[i](ctx,next)
        }
        return
    }
    funArr[0](ctx,next)
}

// 向外输出定义和匹配路由函数
module.exports.mUse=mUse
module.exports.urlGet=urlGet

调用

async function userTest(ctx,next){
    ctx.state.timer = new Date().getTime()
}

async function userTest2(ctx,next) {
    ctx.state.test = 'my name is test2'

}

middleRouer.mUse('/user',userTest,userTest2)
middleRouer.mUse('/',userTest)

async function middleWeare(ctx,next){
    let options = {
        ctx:ctx,
        next:next
    }
    middleRouer.urlGet(options)
    await next()
}

app.use(middleWeare)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文