2016-06-21 1 views
0

私はruby on railsbefore_action同じように、私はフィルタの前に実装する、アプリケーションを実装するためにKOAを使用しています:指摘するkoaフレームワークでフィルターを適用する前にどのように実装するのですか?

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 

一つのことは、私はちょうどいくつかの、すべてのAPIをフィルタリングしたくないということですそれらは、update_userdelete_userのようなものです。

答えて

1

ミドルウェアを使用します。

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) 

これは最も一般的な方法です。使用しているルーティングライブラリによっては、他にもオプションがあります。

たとえば、koa-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) 

それとも、それだけでURLパラメータを指定してルート上で実行されますミドルウェアを指定するrouter.param(name, middleware)を使用することができます。

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) 
関連する問題