我正在使用koa来实现一个应用程序,我想实现一个前置过滤器,就像before_action
中的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
有一点需要指出的是,我不想过滤掉所有api,只有其中一些,例如update_user
delete_user
。
答案 0 :(得分:2)
您使用中间件。
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)
或者您可以使用router.param(name, middleware)
指定仅在具有该URL参数的路由上运行的中间件:
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)