node.js - koa框架中的before过滤器如何实现?

标签 node.js filter koa

我正在使用 koa 来实现一个应用程序,我想实现一个 before 过滤器,就像 Ruby on Rails 中的 before_action 一样:

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,只想过滤其中的一些 api,例如 update_user delete_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-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)

关于node.js - koa框架中的before过滤器如何实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37934601/

相关文章:

node.js - NodeJS EventEmitter 中事件的发送者

javascript - ASP.NET Core 和 Node.js 的相似之处

javascript - Koa v2,在passport-loca登录后获取用户对象

javascript - 单击复选框时无法发出事件。 (socket.io)

javascript - 使用适用于 Node.js 的 AWS 开发工具包将二进制文件上传到 S3

python - Django 过滤外键字段

php - 使用 url 根据值过滤 json 结果

带 $and 运算符和不带运算符的条件之间的 Mongodb 区别

javascript - Koa路由器: How to get query string params?

node.js - 如何等待回调被调用