RPC应用
- hono支持RPC
- 通过RPC,可以导出client给前端使用,具备类型提示,省去了前端写api调用相关类型
RPC好处
-
类型安全: 保证前端调用后端api时,能够自动的验证参数,减少bug,即使api接口改了参数,通过RPC方式,前端能够自动推断类型
-
提升开发效率
路由模块化链式拆分
hono的rpc方式,需要路由链式调用才可以获取正确的rpc,如果单独的通过路由调用无法获取rpc,必须路由链式调用,但是如果对于大型应用,很多路由,需要拆分,如果直接拆分调用,是会丢失rpc类型的, 如何解决?
- 使用RPC 的路由进行分组
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参数是 连接服务端地址- 对于开发和生产环境,可统一通过环境变量来传入
// client.ts
import { AppType } from '.'
import { hc } from 'hono/client'
const client = hc<AppType>('http://localhost:8787/')
注意问题
- RPC类型功能,需要路由链式才能获取正确的类型
- 即 需要在new Hone()链式调用
- 如果每个路由都单独的调用,是无法获取rpc类型的
- 需要通过链式调用,来确保类型的连续性
正确写法:
// 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