Node.js 如何在膝关节炎框架中实现过滤前的过滤? 我使用膝关节炎来实现一个应用程序,我想实现一个前过滤器,就像前面的动作 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 class UsersController CTX.Stase= {} < /代码>中有一个空对象,这是设置这样的数据的合适位置,因为它不会与任何其他属性发生冲突。code>ctx.state.currentUser={uname:'foo'}。请注意,我的回答是针对koa1(2016年)。
需要指出的一点是,我不想过滤所有API,只想过滤其中的一些,比如Node.js 如何在膝关节炎框架中实现过滤前的过滤? 我使用膝关节炎来实现一个应用程序,我想实现一个前过滤器,就像前面的动作 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 class UsersController CTX.Stase= {} < /代码>中有一个空对象,这是设置这样的数据的合适位置,因为它不会与任何其他属性发生冲突。code>ctx.state.currentUser={uname:'foo'}。请注意,我的回答是针对koa1(2016年)。,node.js,filter,koa,Node.js,Filter,Koa,需要指出的一点是,我不想过滤所有API,只想过滤其中的一些,比如update\u userdelete\u user您应该使用中间件 const app = require('koa')(); const router = require('koa-router')(); function * ensureLoggedIn (next) { if (!this.currentUser) { this.redirect('/login') return } // I
update\u user
delete\u user
您应该使用中间件
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路由器允许您实现特定于路由器的中间件,该中间件仅在请求与路由器匹配时运行
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(名称,中间件)
指定仅在具有该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)
const router=require('koa-router')();
//仅当URL具有“id”参数时才运行给定的中间件
router.param('id',ensureLoggedIn,loadUser)
get('/users',function*(){…})
router.get('/users/:id/edit',function*(){…})//如果我必须在路由中使用该泛型函数的输出,或者将其传递给我的视图,我想知道我该怎么做。@Qasim您可以在您的中间件中设置上下文对象的信息(this
在koa1中,或者在koa2中设置处理程序/中间件的第一个参数)。例如,ctx.currentUser={uname:'foo'}
。Koa在“代码> CTX.Stase= {} < /代码>中有一个空对象,这是设置这样的数据的合适位置,因为它不会与任何其他属性发生冲突。code>ctx.state.currentUser={uname:'foo'}
。请注意,我的回答是针对koa1(2016年)。