roger
roger

Reputation: 9923

how to implement before filter in koa framwork?

I am using koa to implement an application, I want to implement a before filter just like before_action in ruby on rails:

class UsersController < ApplicationController
  before_action :logged_in_user, only: [:edit, :update]

    # Before filters

    # Confirms a logged-in user.
    def logged_in_user
      unless logged_in?
        flash[:danger] = "Please log in."
        redirect_to login_url
      end
    end
end

one thing to point out is that I do not want to filter all apis, just some of them, something like update_user delete_user.

Upvotes: 1

Views: 745

Answers (1)

danneu
danneu

Reputation: 9454

You'd use middleware.

const app = require('koa')();
const router = require('koa-router')();

function * ensureLoggedIn (next) {
  if (!this.currentUser) {
    this.redirect('/login')
    return 
  }
  // If we get this far, then we know the user is logged in and 
  // we can yield to the downstream routes.
  yield * next
}

router.get('/users', function * () {...})
router.get('/users/:id/edit', ensureLoggedIn, function * () {...})
router.post('/user/:id', ensureLoggedIn, function * () {...})

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

That's the most generic way. Depending on the routing library you're using, you may have other options.

For example, koa-router lets you implement router-specific middleware that only runs if the request matches the router.

const unrestricted = require('koa-router')();
unrestricted.get('/users', function * () {...})

const loggedIn = require('koa-router')();
loggedIn.use(ensureLoggedIn)
loggedIn.get('/users/:id/edit', function * () {...})
loggedIn.post('/user/:id', function * () {...})

app.use(unrestricted.routes()).use(loggedIn.routes()).listen(3000)

Or you can use router.param(name, middleware) to specify middleware that will only run on routes with that URL parameter:

const router = require('koa-router')();

// Only run the given middleware if the URL has the "id" parameter
router.param('id', ensureLoggedIn, loadUser)

router.get('/users', function * () {...})
router.get('/users/:id/edit', function * () {...})  // <-- 
router.post('/user/:id', function * () {...})       // <--

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

Upvotes: 3

Related Questions