Search code examples
koakoa-router

How can I pass values between koa-router routes


I wanted to move the authentication procedure from all routes into one route (koa-router provides the all() middleware for all methods on a router for this). However, in the process, I decode a token whose decoding I need for further execution. How can I access this decoded token from another route?

const Router = require('koa-router');
const router = new Router({ prefix: '/test' });

router.all('/', async (ctx, next) => {
   //decode
   await next();
})

router.get('/', async ctx=> {
   // Here I need to access decoded, too
});

Solution

  • the Koa Context object encapsulates the request, response and a state object, along with much more. This state object is the recommended namespace where you can pass data between middleware.

    Modifiying the provided example gets:

    const http = require('http')
    const Koa = require('koa')
    const Router = require('koa-router')
    const app = new Koa()
    const router = new Router({ prefix: '/test' })
    
    router.all('/', async (ctx, next) => {
        // decode token
        const x = 'foo'
        // assign decoded token to ctx.state
        ctx.state.token = x
        await next()
     })
    
     router.get('/', async ctx=> {
        // access ctx.state
        console.log(ctx.state.token)
     })
    
     app.use(router.routes())
    http.createServer(app.callback()).listen(3000)
    
    

    Navigate to http://localhost:3000/test and see the decoded token logged to the console.