|
@@ -258,6 +258,7 @@ import { AppDataSource } from '@/server/data-source';
|
|
|
import { UserService } from '@/server/modules/users/user.service';
|
|
import { UserService } from '@/server/modules/users/user.service';
|
|
|
import { AuthService } from '@/server/modules/auth/auth.service';
|
|
import { AuthService } from '@/server/modules/auth/auth.service';
|
|
|
import { TokenResponseSchema } from '../login/password';
|
|
import { TokenResponseSchema } from '../login/password';
|
|
|
|
|
+import { parseWithAwait } from '@/server/utils/parseWithAwait';
|
|
|
|
|
|
|
|
const WechatLoginSchema = z.object({
|
|
const WechatLoginSchema = z.object({
|
|
|
code: z.string().min(1).openapi({
|
|
code: z.string().min(1).openapi({
|
|
@@ -314,7 +315,11 @@ const app = new OpenAPIHono().openapi(wechatLoginRoute, async (c) => {
|
|
|
try {
|
|
try {
|
|
|
const { code } = await c.req.json();
|
|
const { code } = await c.req.json();
|
|
|
const result = await wechatAuthService.wechatLogin(code);
|
|
const result = await wechatAuthService.wechatLogin(code);
|
|
|
- return c.json(result, 200);
|
|
|
|
|
|
|
+
|
|
|
|
|
+ // 使用 parseWithAwait 确保返回数据符合Schema定义
|
|
|
|
|
+ const validatedResult = await parseWithAwait(TokenResponseSchema, result);
|
|
|
|
|
+
|
|
|
|
|
+ return c.json(validatedResult, 200);
|
|
|
} catch (error) {
|
|
} catch (error) {
|
|
|
return c.json({
|
|
return c.json({
|
|
|
code: 401,
|
|
code: 401,
|
|
@@ -339,7 +344,60 @@ const app = new OpenAPIHono()
|
|
|
export default app;
|
|
export default app;
|
|
|
```
|
|
```
|
|
|
|
|
|
|
|
-### 5. 注册微信路由
|
|
|
|
|
|
|
+### 5. parseWithAwait 使用规范
|
|
|
|
|
+
|
|
|
|
|
+#### 概述
|
|
|
|
|
+`parseWithAwait` 是通用CRUD模块提供的数据验证工具,用于确保返回数据的类型安全,支持异步验证和转换。
|
|
|
|
|
+
|
|
|
|
|
+#### 使用场景
|
|
|
|
|
+所有涉及数据查询和返回的扩展路由都应使用 `parseWithAwait` 处理响应数据。
|
|
|
|
|
+
|
|
|
|
|
+#### 基本用法
|
|
|
|
|
+```typescript
|
|
|
|
|
+import { parseWithAwait } from '@/server/utils/parseWithAwait';
|
|
|
|
|
+
|
|
|
|
|
+// 验证单个实体
|
|
|
|
|
+const validatedEntity = await parseWithAwait(YourEntitySchema, entityData);
|
|
|
|
|
+
|
|
|
|
|
+// 验证实体数组
|
|
|
|
|
+const validatedEntities = await parseWithAwait(z.array(YourEntitySchema), entitiesData);
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+#### 集成示例
|
|
|
|
|
+```typescript
|
|
|
|
|
+// 在微信登录路由中使用 parseWithAwait
|
|
|
|
|
+const app = new OpenAPIHono().openapi(wechatLoginRoute, async (c) => {
|
|
|
|
|
+ try {
|
|
|
|
|
+ const { code } = await c.req.json();
|
|
|
|
|
+ const result = await wechatAuthService.wechatLogin(code);
|
|
|
|
|
+
|
|
|
|
|
+ // 使用 parseWithAwait 确保返回数据符合Schema定义
|
|
|
|
|
+ const validatedResult = await parseWithAwait(TokenResponseSchema, result);
|
|
|
|
|
+
|
|
|
|
|
+ return c.json(validatedResult, 200);
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ return c.json({
|
|
|
|
|
+ code: 401,
|
|
|
|
|
+ message: error instanceof Error ? error.message : '微信登录失败'
|
|
|
|
|
+ }, 401);
|
|
|
|
|
+ }
|
|
|
|
|
+});
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+#### 优势
|
|
|
|
|
+- **类型安全**:确保返回数据完全符合Zod schema定义
|
|
|
|
|
+- **异步支持**:支持异步验证和转换操作
|
|
|
|
|
+- **错误处理**:提供详细的验证错误信息
|
|
|
|
|
+- **性能优化**:避免运行时类型错误
|
|
|
|
|
+- **向后兼容**:与现有代码完全兼容
|
|
|
|
|
+
|
|
|
|
|
+#### 最佳实践
|
|
|
|
|
+1. **所有查询路由**:GET请求返回数据前必须使用 `parseWithAwait`
|
|
|
|
|
+2. **列表查询**:使用 `z.array(EntitySchema)` 格式验证数组
|
|
|
|
|
+3. **单条查询**:直接使用实体Schema验证单个对象
|
|
|
|
|
+4. **错误处理**:捕获并适当处理验证错误
|
|
|
|
|
+
|
|
|
|
|
+### 6. 注册微信路由
|
|
|
|
|
|
|
|
在API入口文件中注册微信路由:
|
|
在API入口文件中注册微信路由:
|
|
|
|
|
|