跳到主要内容

RPC应用

  • hono支持RPC
  • 通过RPC,可以导出client给前端使用,具备类型提示,省去了前端写api调用相关类型

RPC好处​

  • 类型安全: 保证前端调用后端api时,能够自动的验证参数,减少bug,即使api接口改了参数,通过RPC方式,前端能够自动推断类型

  • 提升开发效率

路由模块化链式拆分​

hono的rpc方式,需要路由链式调用才可以获取正确的rpc,如果单独的通过路由调用无法获取rpc,必须路由链式调用,但是如果对于大型应用,很多路由,需要拆分,如果直接拆分调用,是会丢失rpc类型的, 如何解决?

  • 使用RPC 的路由进行分组
js
import { Hono } from 'hono'
import { hc } from 'hono/client'

const authorsApp = new Hono()
.get('/', (c) => c.json({ result: 'list authors' }))
.post('/', (c) => c.json({ result: 'create an author' }, 201))
.get('/:id', (c) => c.json({ result: `get ${c.req.param('id')}` }))

const booksApp = new Hono()
.get('/', (c) => c.json({ result: 'list books' }))
.post('/', (c) => c.json({ result: 'create a book' }, 201))
.get('/:id', (c) => c.json({ result: `get ${c.req.param('id')}` }))

const app = new Hono()
.route('/authors', authorsApp)
.route('/books', booksApp)

type AppType = typeof app

获取rpc类型​

  • hc方法传入的URL参数是 连接服务端地址
    • 对于开发和生产环境,可统一通过环境变量来传入
js
// client.ts
import { AppType } from '.'
import { hc } from 'hono/client'

const client = hc<AppType>('http://localhost:8787/')

注意问题​

  • RPC类型功能,需要路由链式才能获取正确的类型
    • 即 需要在new Hone()链式调用
  • 如果每个路由都单独的调用,是无法获取rpc类型的
  • 需要通过链式调用,来确保类型的连续性

正确写法:

js
// authors.ts
import { Hono } from 'hono'

const app = new Hono()
.get('/', (c) => c.json('list authors'))
.post('/', (c) => c.json('create an author', 201))
.get('/:id', (c) => c.json(`get ${c.req.param('id')}`))

export default app