Tube - Video Page

4 阅读2分钟
  • 关于数据库查询
    • .innerJoin(table, onCondition) - SQL中的内连接,用于将两个表根据某个条件进行连接,返回两个表中都匹配的数据
    • getTableColumns(table) - Drizzle ORM 提供的一个函数,从某个表结构中提取所有字段的列定义,我们这里返回一个嵌套对象,结果如下:
    {
        ...videos 表字段,
        user: { ...users 表字段 }
    }
    
    // src/modules/videos/server/procedure.ts
    
    import { eq, and, getTableColumns } from 'drizzle-orm'
    
    export const videosRouter = createTRPCRouter({
        getOne: baseProcedure
            .input(z.object({ id: z.string().uuid() })) 
            .query(async ({ ctx, input }) => {
              const [video] = await db
                .select({
                  ...getTableColumns(videos),
                  user: {...getTableColumns(users) } 
                })
                .from(videos)
                .innerJoin(users, eq(videos.userId, users.id)) // 关联用户表,获取用户信息
                .where(eq(videos.id, input.id)) 
              if (!video) throw new TRPCError({ code: 'NOT_FOUND' })
              return video
            }),
    })
    
  • tRPC类型推导
    • 在Js中,可随意写变量let x = 123let y = "1333",因为JS是动态类型语言,运行时才知道变量类型
    • TS中类型是静态的,编译时就知道变量类型,let x:number = 123
    • Type Inference 类型推导,就是TS自动猜测变量或函数的类型,当直接写let name = "Alice",TS会根据赋值内容推断类型;函数中也会根据参数类型推断结果的类型
    • 在tRPC中的类型推导,是 动态接口=>静态类型:
      • 根据后端自动推断出这个接口的返回值类型,不用手写
      • 自动跟随后端更新,避免重复写
      • inferRouterOutputs 用来推导某个tRPC路由的输出类型
      • AppRouter 总路由对象,聚合了路由子模块
      • inferRouterOutpus<AppRouter> 根据AppRouter自动推断每个路由方法的输出类型
      • ['videos']['getOne'] 取出videos路由下的getOne这方法的返回类型
     import { inferRouterOutputs } from "@trpc/server";
    
     import { AppRouter } from "@/trpc/routers/_app";
    
     export type VideoGetOneOutput = inferRouterOutputs<AppRouter>['videos']['getOne'];
    
  • Hook useMemo()
    • 缓存计算结果,避免在每次组件重新渲染时都重复执行一些开销较大的计算
    • Intl.NumberFormat() 是JS内置的国际化 API,用来格式化数字