Skip to content

Combine 中间件

Combine 中间件可以把多个中间件函数组合成一个中间件,提供以下三个工具函数:

  • some:只要其中一个中间件成功运行即可。
  • every:依次执行所有中间件。
  • except:在条件不成立时执行所有中间件。

导入

ts
import { Hono } from 'hono'
import { some, every, except } from 'hono/combine'

用法

下面示例展示了如何用 Combine 中间件构建复杂的访问控制规则。

ts
import { Hono } from 'hono'
import { bearerAuth } from 'hono/bearer-auth'
import { getConnInfo } from 'hono/cloudflare-workers'
import { every, some } from 'hono/combine'
import { ipRestriction } from 'hono/ip-restriction'
import { rateLimit } from '@/my-rate-limit'

const app = new Hono()

app.use(
  '*',
  some(
    every(
      ipRestriction(getConnInfo, { allowList: ['192.168.0.2'] }),
      bearerAuth({ token })
    ),
    // 如果两个条件都满足,则不会执行 rateLimit。
    rateLimit()
  )
)

app.get('/', (c) => c.text('Hello Hono!'))

some

执行第一个返回成功的中间件。中间件按顺序应用,只要某个中间件成功结束,后续中间件就不会再执行。

ts
import { some } from 'hono/combine'
import { bearerAuth } from 'hono/bearer-auth'
import { myRateLimit } from '@/rate-limit'

// 如果客户端拥有有效令牌,则跳过限流。
// 否则执行限流。
app.use(
  '/api/*',
  some(bearerAuth({ token }), myRateLimit({ limit: 100 }))
)

every

依次执行所有中间件,只要有一个失败就会停止。中间件按顺序应用,如果任何一个抛出错误,后续中间件将不会执行。

ts
import { some, every } from 'hono/combine'
import { bearerAuth } from 'hono/bearer-auth'
import { myCheckLocalNetwork } from '@/check-local-network'
import { myRateLimit } from '@/rate-limit'

// 如果客户端位于本地网络,则跳过认证和限流。
// 否则同时应用认证与限流。
app.use(
  '/api/*',
  some(
    myCheckLocalNetwork(),
    every(bearerAuth({ token }), myRateLimit({ limit: 100 }))
  )
)

except

当条件满足时跳过执行,其余情况会运行所有中间件。条件可以是字符串或函数,若需要匹配多个目标可传入数组。

ts
import { except } from 'hono/combine'
import { bearerAuth } from 'hono/bearer-auth'

// 如果访问公共 API,则跳过认证。
// 否则需要有效令牌。
app.use('/api/*', except('/api/public/*', bearerAuth({ token })))

Released under the MIT License.