feat: 添加RPC API路由支持与Zod验证错误响应
- 添加RPC API路由处理,支持多种HTTP方法并集成Zod验证错误的自定义错误响应。 - 添加对 `/api/rpc/$` 路由路径的支持,包括路由配置、类型定义和路由树的更新。
This commit is contained in:
70
src/routes/api/rpc.$.ts
Normal file
70
src/routes/api/rpc.$.ts
Normal file
@@ -0,0 +1,70 @@
|
||||
import { ORPCError, onError, ValidationError } from '@orpc/server'
|
||||
import { RPCHandler } from '@orpc/server/fetch'
|
||||
import { createFileRoute } from '@tanstack/react-router'
|
||||
import { z } from 'zod'
|
||||
import { router } from '@/orpc/router'
|
||||
|
||||
const handler = new RPCHandler(router, {
|
||||
interceptors: [
|
||||
onError((error) => {
|
||||
console.error(error)
|
||||
}),
|
||||
],
|
||||
clientInterceptors: [
|
||||
onError((error) => {
|
||||
if (
|
||||
error instanceof ORPCError &&
|
||||
error.code === 'BAD_REQUEST' &&
|
||||
error.cause instanceof ValidationError
|
||||
) {
|
||||
// If you only use Zod you can safely cast to ZodIssue[]
|
||||
const zodError = new z.ZodError(
|
||||
error.cause.issues as z.core.$ZodIssue[],
|
||||
)
|
||||
|
||||
throw new ORPCError('INPUT_VALIDATION_FAILED', {
|
||||
status: 422,
|
||||
message: z.prettifyError(zodError),
|
||||
data: z.flattenError(zodError),
|
||||
cause: error.cause,
|
||||
})
|
||||
}
|
||||
|
||||
if (
|
||||
error instanceof ORPCError &&
|
||||
error.code === 'INTERNAL_SERVER_ERROR' &&
|
||||
error.cause instanceof ValidationError
|
||||
) {
|
||||
throw new ORPCError('OUTPUT_VALIDATION_FAILED', {
|
||||
cause: error.cause,
|
||||
})
|
||||
}
|
||||
}),
|
||||
],
|
||||
})
|
||||
|
||||
async function handle({ request }: { request: Request }) {
|
||||
const { matched, response } = await handler.handle(request, {
|
||||
prefix: '/api/rpc',
|
||||
context: {},
|
||||
})
|
||||
|
||||
if (matched) {
|
||||
return response
|
||||
}
|
||||
|
||||
return new Response('Not Found', { status: 404 })
|
||||
}
|
||||
|
||||
export const Route = createFileRoute('/api/rpc/$')({
|
||||
server: {
|
||||
handlers: {
|
||||
HEAD: handle,
|
||||
GET: handle,
|
||||
POST: handle,
|
||||
PUT: handle,
|
||||
PATCH: handle,
|
||||
DELETE: handle,
|
||||
},
|
||||
},
|
||||
})
|
||||
Reference in New Issue
Block a user