久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

T3 Stack全棧實(shí)踐:用TypeScript打通Next.js、tRPC與Prisma的端到端類型安全

T3 Stack全棧實(shí)踐:用TypeScript打通Next.js、tRPC與Prisma的端到端類型安全 如果你最近在關(guān)注 TypeScript 全棧開發(fā)大概率繞不開t3code這個(gè)名字。它不是某個(gè)單一的開源庫(kù)也不是一款具體的云服務(wù)而是一整套以T3 Stack為核心的全棧代碼實(shí)踐方案用 Next.js 搭界面、用 tRPC 打通前后端、用 Prisma 管數(shù)據(jù)庫(kù)、用 Tailwind 寫樣式再加上 TypeScript 把所有環(huán)節(jié)的類型串成一條線。這篇文章我從實(shí)際開發(fā)角度拆解這套技術(shù)棧講清楚每個(gè)環(huán)節(jié)為什么這么選、具體怎么落地、遇到問(wèn)題怎么排查適合正在學(xué)習(xí)全棧開發(fā)、準(zhǔn)備從傳統(tǒng) REST API 轉(zhuǎn)向端到端類型安全的同學(xué)參考。1. 內(nèi)容整體設(shè)計(jì)與思路拆解1.1 t3code 的核心定位不是框架是一套組合拳先說(shuō)結(jié)論t3code這個(gè)代號(hào)背后代表的是一套已經(jīng)過(guò)了大規(guī)模驗(yàn)證的全棧應(yīng)用組織方式。它沒(méi)有發(fā)明多少新東西而是把 Next.js、TypeScript、Tailwind CSS、tRPC、Prisma 這些成熟工具按照類型安全優(yōu)先的原則組合在一起。很多人第一次聽到T3會(huì)以為是某個(gè)新框架實(shí)際上它是 The T3 Stack 的簡(jiǎn)稱核心原則很簡(jiǎn)單能編譯期解決的就不要留到運(yùn)行時(shí)。這套組合拳最讓我看重的點(diǎn)在于開發(fā)體驗(yàn)的連續(xù)性。以前我做一個(gè)全棧功能前端寫一遍接口類型定義后端又要維護(hù)一份兩邊經(jīng)常對(duì)不上聯(lián)調(diào)時(shí)大量時(shí)間浪費(fèi)在你返回的字段名拼錯(cuò)了這種低級(jí)問(wèn)題上。T3 技術(shù)棧把 API 層直接做成類型安全的 RPC 調(diào)用后端定義什么類型前端拿到的就是什么類型鼠標(biāo)懸停就能看到完整的返回結(jié)構(gòu)徹底告別接口文檔滯后的問(wèn)題。從項(xiàng)目管理的角度看t3code 這種模式天然適合中小型團(tuán)隊(duì)。你把數(shù)據(jù)庫(kù) schema、路由處理、頁(yè)面組件放在一個(gè)代碼庫(kù)里前后端同學(xué)可以并行開發(fā)同一個(gè)功能的不同層級(jí)又因?yàn)轭愋图s束很難出現(xiàn)前端等后端接口的阻塞狀態(tài)。這里涉及一個(gè)很重要的思考技術(shù)選型不是追新而是看它能不能把團(tuán)隊(duì)協(xié)作摩擦降到最低。1.2 為什么選擇 Next.js tRPC傳統(tǒng) REST API 的痛點(diǎn)傳統(tǒng)的前后端分離架構(gòu)里前端用 axios 請(qǐng)求 REST API你需要自己處理請(qǐng)求路徑、參數(shù)序列化、錯(cuò)誤碼判斷、響應(yīng)類型斷言。一套正常的中型系統(tǒng)光接口定義文檔就能寫幾百頁(yè)而且后端一改字段前端根本感知不到直到接口返回空值才反應(yīng)過(guò)來(lái)。Next.js 作為 React 框架其實(shí)解決的是渲染層面的問(wèn)題它本身并不管數(shù)據(jù)怎么流通。真正讓 t3code 變得好用的關(guān)鍵是 tRPC 這套遠(yuǎn)程調(diào)用方案。你可以把 tRPC 理解成給函數(shù)調(diào)用裝上網(wǎng)絡(luò)傳輸能力后端寫好一個(gè)函數(shù)procedure前端像調(diào)用本地函數(shù)一樣調(diào)用它。不需要手工拼接 URL不需要請(qǐng)求庫(kù)不需要 mock 數(shù)據(jù)類型是從數(shù)據(jù)庫(kù)一路傳遞到頁(yè)面組件的。小提示tRPC 不等于 GraphQL。GraphQL 的核心價(jià)值是客戶端按需選擇字段tRPC 的核心價(jià)值是端到端類型安全兩者解決的不是同一個(gè)問(wèn)題不要混為一談。也許有人會(huì)問(wèn)既然 RPC 這么好為什么不是所有項(xiàng)目都用它答案在于適用邊界。T3 技術(shù)棧適合前后端共享代碼庫(kù)的全棧應(yīng)用、MVP 產(chǎn)品、內(nèi)部工具但如果你需要流式傳輸、長(zhǎng)連接推送、對(duì)外開放給第三方開發(fā)者使用那還得靠更通用的 HTTP API 方案。選型永遠(yuǎn)是 trade-off沒(méi)有銀彈。1.3 技術(shù)棧全景每個(gè)成員各司其職我按照數(shù)據(jù)流的方向把這套技術(shù)棧的關(guān)鍵成員排列一下層級(jí)工具職責(zé)核心優(yōu)勢(shì)數(shù)據(jù)庫(kù)層Prisma SQLite/PostgreSQL數(shù)據(jù)建模與遷移Schema 即類型來(lái)源服務(wù)層tRPC Router業(yè)務(wù)邏輯與數(shù)據(jù)校驗(yàn)端到端類型自動(dòng)推導(dǎo)表現(xiàn)層Next.js TypeScript頁(yè)面渲染與路由SSR、RSC 靈活組合樣式層Tailwind CSS原子化樣式開發(fā)速度與一致性工程化create-t3-app腳手架初始化統(tǒng)一目錄與規(guī)范認(rèn)證可選NextAuth.js登錄與會(huì)話管理與 tRPC 無(wú)縫集成這份清單里我最想強(qiáng)調(diào)的是 Prisma 的角色。Prisma 通過(guò) schema.prisma 文件定義數(shù)據(jù)模型啟動(dòng)時(shí)生成 TypeScript 類型tRPC 的 query 返回結(jié)果直接帶上這些類型前端調(diào)用后自動(dòng)獲得類型推斷。整個(gè)鏈路里唯一需要人工維護(hù)的事實(shí)來(lái)源就是數(shù)據(jù)庫(kù) schema剩下的類型都是一層層自動(dòng)推導(dǎo)出來(lái)的。我用的類比是這就像一條流水線原料數(shù)據(jù)模型進(jìn)機(jī)器出來(lái)的都是包裝好的標(biāo)品帶類型的函數(shù)調(diào)用不需要中途再手動(dòng)貼標(biāo)簽。2. 核心細(xì)節(jié)解析與實(shí)操要點(diǎn)2.1 手寫 create-t3-app初始化項(xiàng)目到底發(fā)生了什么初始化一個(gè) t3code 項(xiàng)目你只需要跑一條命令npx create-t3-applatest my-t3-app執(zhí)行這條命令時(shí)腳手架會(huì)以交互模式詢問(wèn)你要啟用哪些模塊Next.js 配置、TypeScript 嚴(yán)格模式、Tailwind、Prisma、tRPC、NextAuth。我建議第一遍使用全部默認(rèn)選項(xiàng)讓腳手架把整個(gè)骨架搭起來(lái)后面再逐步改造。命令行終端會(huì)提示你選擇包管理器我一般用 pnpm原因不是快而是依賴鏈接方式更嚴(yán)格能提前暴露隱式依賴問(wèn)題。腳手架生成的項(xiàng)目結(jié)構(gòu)有幾個(gè)關(guān)鍵節(jié)點(diǎn)值得先說(shuō)清楚prisma/schema.prisma所有數(shù)據(jù)模型的唯一來(lái)源src/server/api/root.tstRPC 路由的根節(jié)點(diǎn)所有子路由都在這里匯聚src/server/api/routers/按業(yè)務(wù)域拆分的路由文件目錄src/trpc/server.ts服務(wù)端 tRPC 上下文創(chuàng)建邏輯src/trpc/react.tsx客戶端 tRPC Provider 封裝src/env.js環(huán)境變量校驗(yàn)文件用了 zod 做運(yùn)行時(shí)校驗(yàn)第一次看到這么多文件可能有點(diǎn)懵但我給你一個(gè)定心丸這個(gè)目錄命名和代碼組織方式不是腳手架隨機(jī)生成的而是社區(qū)反復(fù)迭代后的最佳實(shí)踐。你別急著重構(gòu)目錄結(jié)構(gòu)先用它跑通一條完整鏈路再根據(jù)業(yè)務(wù)規(guī)模決定要不要繼續(xù)拆分。2.2 TypeScript 嚴(yán)格模式的真實(shí)價(jià)值把錯(cuò)誤堵在編譯期T3 技術(shù)棧在初始化時(shí)默認(rèn)開啟strict: true還會(huì)配置路徑別名/指向src/。這些配置不是錦上添花而是整個(gè)類型安全體系的地基。如果你把 strict 關(guān)掉tRPC 的很多類型推斷會(huì)退化為any這套技術(shù)棧的優(yōu)勢(shì)直接歸零。我用一個(gè)生活中的類比解釋嚴(yán)格模式的價(jià)值你拿到一份外賣訂單紙面上寫著中辣如果接到訂單的人必須口頭確認(rèn)辣度級(jí)別就可能出現(xiàn)偏差但如果訂單系統(tǒng)從一開始就規(guī)定辣度字段只能是微辣/中辣/特辣三選一整個(gè)流程就不會(huì)有歧義。TypeScript 嚴(yán)格模式做的就是這件事把接口邊界、空值處理、類型斷言全部規(guī)范化讓整個(gè)系統(tǒng)從源頭減少歧義。實(shí)操中我會(huì)額外在tsconfig.json里開啟幾個(gè)衍生選項(xiàng){ compilerOptions: { noUncheckedIndexedAccess: true, exactOptionalPropertyTypes: true, noPropertyAccessFromIndexSignature: true } }noUncheckedIndexedAccess會(huì)強(qiáng)制你處理數(shù)組元素可能是 undefined 的情況這在實(shí)際開發(fā)中能抓到大量隱性 bug。剛開這些選項(xiàng)時(shí)項(xiàng)目里會(huì)冒出一大片紅色波浪線別慌那都是在提醒你之前哪里寫得不夠嚴(yán)謹(jǐn)逐個(gè)修復(fù)就好不用為了省事關(guān)掉它們。2.3 tRPC 的邊界設(shè)計(jì)query、mutate 與 protectedProceduretRPC 路由層是 t3code 最核心的部分。它把 API 定義為兩類函數(shù)query負(fù)責(zé)獲取數(shù)據(jù)mutation負(fù)責(zé)修改數(shù)據(jù)。這個(gè)概念很像 GraphQL 的 Query 和 Mutation 之分但實(shí)現(xiàn)方式輕量得多。先從最簡(jiǎn)單的例子直觀感受一下代碼形態(tài)。定義一個(gè)帖子列表接口// src/server/api/routers/post.ts import { z } from zod; import { createTRPCRouter, publicProcedure } from ~/trpc/server; export const postRouter createTRPCRouter({ list: publicProcedure .query(async ({ ctx }) { return ctx.db.post.findMany({ orderBy: { createdAt: desc }, take: 20, }); }), });前端調(diào)用時(shí)不需要任何 URL 拼接或請(qǐng)求配置const { data, isLoading } api.post.list.useQuery();data的類型就是Post[]自動(dòng)帶上了 Prisma 查詢結(jié)果的全部類型信息。這里請(qǐng)注意一個(gè)細(xì)節(jié)useQuery返回的data類型中包含了createdAt等數(shù)據(jù)庫(kù)字段如果你只想暴露部分字段需要在服務(wù)端查詢里用select顯式控制返回結(jié)構(gòu)而不是指望客戶端去過(guò)濾因?yàn)?tRPC 的類型安全是編譯期的不是運(yùn)行時(shí)約束。對(duì)于需要登錄才能訪問(wèn)的接口T3 技術(shù)棧提供了protectedProcedure封裝。它的思路是在 tRPC 上下文里先拿到 session如果用戶未登錄直接拋出錯(cuò)誤后續(xù)所有路由都不需要再關(guān)注鑒權(quán)邏輯。2.4 Tailwind CSS 在真實(shí)項(xiàng)目中的組織方式Tailwind CSS 在 T3 技術(shù)棧里是默認(rèn)樣式方案但它不是唯一選擇。很多人對(duì)原子化 CSS 有偏見覺(jué)得它會(huì)讓 HTML 類名變得又臭又長(zhǎng)。我的看法是在 t3code 這種快速迭代的全棧項(xiàng)目里Tailwind 的收益遠(yuǎn)大于代價(jià)。我推薦一個(gè)組件級(jí)樣式組織策略把經(jīng)常重復(fù)的 UI 模式封裝成 React 組件組件內(nèi)部使用 Tailwind 類名對(duì)外暴露簡(jiǎn)潔的 props。比如一個(gè) Card 組件// src/components/ui/card.tsx import { cn } from ~/lib/utils; export function Card({ className, children }: { className?: string; children: React.ReactNode }) { return ( div className{cn(rounded-2xl border border-gray-200 bg-white p-6 shadow-sm, className)} {children} /div ); }這樣外部使用者只需要Card classNamemt-4不用關(guān)心內(nèi)部是一坨什么類名。把可變的產(chǎn)物留給組件內(nèi)部把業(yè)務(wù)頁(yè)面的差異化通過(guò)className傳進(jìn)來(lái)這是我實(shí)測(cè)最平衡且好維護(hù)的方案。如果團(tuán)隊(duì)打算在 t3code 基礎(chǔ)上構(gòu)建一個(gè)中大型應(yīng)用我會(huì)建議引入 shadcn/ui 那一套組件工廠模式但項(xiàng)目的初版階段自己封裝幾個(gè)基礎(chǔ)組件就夠了。3. 實(shí)操過(guò)程與核心環(huán)節(jié)實(shí)現(xiàn)3.1 從零到一用 t3code 搭一個(gè)可復(fù)現(xiàn)的記賬本應(yīng)用紙上談兵沒(méi)有意思我實(shí)際帶大家走一遍完整流程以一個(gè)記賬本應(yīng)用為例。這個(gè)例子包含列表展示、金額記錄、分類篩選能覆蓋 tRPC 最常見的用法。創(chuàng)建項(xiàng)目時(shí)我們?cè)诮换ミx項(xiàng)里選擇 Prisma、tRPC、NextAuth先用郵箱登錄占位數(shù)據(jù)庫(kù)先選 SQLite 降低啟動(dòng)成本后面部署再換 PostgreSQL。這里多說(shuō)一句SQLite 與 PostgreSQL 在 Prisma schema 語(yǔ)法層面幾乎一致只是 provider 字段不同所以前期用 SQLite 做本地開發(fā)完全沒(méi)有問(wèn)題。初始化完成后第一步修改數(shù)據(jù)模型// prisma/schema.prisma generator client { provider prisma-client-js } datasource db { provider sqlite url env(DATABASE_URL) } model Transaction { id String id default(cuid()) amount Float category String note String? createdAt DateTime default(now()) index([category]) }改完 schema 后執(zhí)行npx prisma migrate dev --name init。這條命令會(huì)創(chuàng)建遷移文件并生成 Prisma Client。注意一個(gè)關(guān)鍵順序必須先遷移、后啟動(dòng)開發(fā)服務(wù)器否則 tRPC 路由里使用ctx.db時(shí)會(huì)因?yàn)?Prisma Client 尚未生成而報(bào)錯(cuò)。初次執(zhí)行時(shí)你可能會(huì)發(fā)現(xiàn)node_modules/.prisma/client目錄出現(xiàn)了大量新文件這是正常現(xiàn)象不要因?yàn)槎喑龅奈募械讲话病?.2 設(shè)計(jì) tRPC Router記賬本的核心接口業(yè)務(wù)接口分兩大塊查詢流水列表、新增一筆流水。篩選條件通過(guò) input 傳入。這里重點(diǎn)展示輸入校驗(yàn)的作用因?yàn)楹芏嗳藭?huì)把 tRPC 的 input 校驗(yàn)忽略掉導(dǎo)致前端傳歪數(shù)據(jù)數(shù)據(jù)庫(kù)層才開始報(bào)錯(cuò)為時(shí)已晚。// src/server/api/routers/transaction.ts import { z } from zod; import { createTRPCRouter, publicProcedure } from ~/trpc/server; const transactionSchema z.object({ amount: z.number().positive(金額必須大于0), category: z.string().min(1, 分類不能為空), note: z.string().max(100).optional(), }); export const transactionRouter createTRPCRouter({ list: publicProcedure .input( z.object({ category: z.string().optional(), limit: z.number().int().min(1).max(50).default(20), }) ) .query(async ({ ctx, input }) { const whereClause input.category ? { category: input.category } : {}; return ctx.db.transaction.findMany({ where: whereClause, orderBy: { createdAt: desc }, take: input.limit, }); }), create: publicProcedure .input(transactionSchema) .mutation(async ({ ctx, input }) { return ctx.db.transaction.create({ data: input, }); }), });這段代碼同時(shí)體現(xiàn)了兩層價(jià)值第一層是類型安全性ctx.db.transaction.findMany返回的字段自動(dòng)推導(dǎo)到前端第二層是數(shù)據(jù)校驗(yàn)zod 會(huì)在請(qǐng)求進(jìn)入數(shù)據(jù)庫(kù)前就攔截非法數(shù)據(jù)。比如amount: -5會(huì)被直接拒絕而不是落到 SQL 層才出錯(cuò)。從我踩過(guò)的坑來(lái)看很多人會(huì)在前端表單里做校驗(yàn)服務(wù)端不設(shè)防這是很危險(xiǎn)的因?yàn)榻涌谝坏┍荒_本繞過(guò)頁(yè)面直連沒(méi)有服務(wù)端校驗(yàn)的系統(tǒng)就會(huì)灌入臟數(shù)據(jù)。路由寫完后把它掛載到根節(jié)點(diǎn)// src/server/api/root.ts import { createTRPCRouter } from ~/trpc/server; import { transactionRouter } from ./routers/transaction; export const appRouter createTRPCRouter({ transaction: transactionRouter, }); export type AppRouter typeof appRouter;注意export type AppRouter這行它把路由類型導(dǎo)出客戶端會(huì)從同一個(gè).ts文件拿到類型定義這就是端到端類型安全的物理基礎(chǔ)。3.3 前端頁(yè)面從 useQuery 到交互全部打通前端部分使用 Next.js App Router。因?yàn)?t3code 自動(dòng)分離服務(wù)端和客戶端組件我們需要用useQuery時(shí)一定要在組件頂部加use client指令否則會(huì)報(bào) Server Components 無(wú)法使用 hook 的錯(cuò)誤。記賬本首頁(yè)的簡(jiǎn)化實(shí)現(xiàn)// src/app/page.tsx use client; import { api } from ~/trpc/react; import { useState } from react; export default function HomePage() { const [categoryFilter, setCategoryFilter] useState(); const { data: transactions, refetch } api.transaction.list.useQuery({ category: categoryFilter || undefined, }); const createMutation api.transaction.create.useMutation({ onSuccess: () { refetch(); }, }); const handleSubmit (e: React.FormEvent) { e.preventDefault(); const formData new FormData(e.currentTarget as HTMLFormElement); createMutation.mutate({ amount: Number(formData.get(amount)), category: String(formData.get(category)), note: String(formData.get(note)), }); }; return ( main classNamemx-auto max-w-2xl p-8 h1 classNametext-2xl font-bold記賬本/h1 form onSubmit{handleSubmit} classNamemy-6 flex gap-3 input nameamount typenumber step0.01 placeholder金額 classNameborder p-2 / input namecategory placeholder分類 classNameborder p-2 / input namenote placeholder備注 classNameborder p-2 / button typesubmit classNamebg-blue-600 text-white px-4 py-2 rounded 添加 /button /form ul {transactions?.map((tx) ( li key{tx.id} classNameflex justify-between border-b py-2 span{tx.category}/span span¥{tx.amount.toFixed(2)}/span /li ))} /ul /main ); }這段代碼可以原樣跑起來(lái)但我得提醒幾個(gè)關(guān)鍵點(diǎn)。第一api.transaction.list.useQuery會(huì)走 tRPC 內(nèi)部狀態(tài)管理它不發(fā)表單請(qǐng)求也不會(huì)手動(dòng)維護(hù) URL所有請(qǐng)求細(xì)節(jié)都被封裝好了。第二useMutation的onSuccess里調(diào)用refetch是初版最直接的刷新方式后期可以換成 tRPC 的utils.transaction.list.invalidate()這是官方推薦方式能讓所有監(jiān)聽同一 key 的組件同時(shí)刷新。3.4 構(gòu)建與部署本地驗(yàn)證和生產(chǎn)環(huán)境的差異開發(fā)環(huán)境跑通之后部署時(shí)最大的變化是數(shù)據(jù)庫(kù)和后端環(huán)境變量。本地開發(fā)用 SQLite部署到生產(chǎn)環(huán)境我會(huì)換成 PostgreSQL。這個(gè)切換在 t3code 里只是改 provider 字段和 DATABASE_URL 的值嗎沒(méi)那么簡(jiǎn)單有幾個(gè)隱藏點(diǎn)需要同步處理。prisma/schema.prisma中 datasource provider 需要從sqlite改成postgresql然后重新生成遷移。PostgreSQL 需要額外的連接池參數(shù)如果不設(shè)置默認(rèn)連接數(shù)可能在并發(fā)上來(lái)之后被打滿。我習(xí)慣在src/server/db.ts中擴(kuò)展 PrismaClient 實(shí)例// src/server/db.ts import { PrismaClient } from prisma/client; const globalForPrisma globalThis as unknown as { prisma?: PrismaClient }; export const db globalForPrisma.prisma ?? new PrismaClient({ log: process.env.NODE_ENV development ? [query, error, warn] : [error], }); if (process.env.NODE_ENV ! production) globalForPrisma.prisma db;這段代碼是社區(qū)里的標(biāo)準(zhǔn)防熱重載方案。Next.js 開發(fā)模式下模塊可能被反復(fù)加載如果每次加載都新建一個(gè) PrismaClient最終會(huì)耗盡數(shù)據(jù)庫(kù)連接數(shù)。把實(shí)例掛到globalThis上開發(fā)模式就只會(huì)在全局創(chuàng)建一個(gè)實(shí)例。生產(chǎn)環(huán)境下不需要這個(gè)緩存邏輯所以用環(huán)境變量做了區(qū)分。部署階段我建議用 Docker 把 Next.js 應(yīng)用和數(shù)據(jù)庫(kù)一起編排出鏡像但這篇文章不展開 Docker 細(xì)節(jié)。我只強(qiáng)調(diào)一個(gè)踩坑點(diǎn)在 Serverless 平臺(tái)上部署時(shí)PrismaClient 初始化時(shí)機(jī)要避開請(qǐng)求熱路徑否則每個(gè)冷啟動(dòng)實(shí)例都可能創(chuàng)建新的連接池造成數(shù)據(jù)庫(kù)鏈接耗盡。4. 常見問(wèn)題與排查技巧實(shí)錄4.1 tRPC 類型報(bào)錯(cuò)data 提示 undefined 或類型不匹配這是初學(xué)者遇到最多的一類問(wèn)題。現(xiàn)象是data的類型看起來(lái)是Transaction[]但實(shí)際使用時(shí)報(bào)Object is possibly undefined。原因在于 React Query 的data本質(zhì)上是個(gè)可空值查詢未完成時(shí)是 undefined查詢失敗也是 undefined。所以正確的寫法是先用條件判斷保護(hù){!transactions ? ( p加載中.../p ) : ( transactions.map((tx) div key{tx.id}{tx.amount}/div) )}另一個(gè)高發(fā)問(wèn)題是前后端類型不匹配。如果你的 tRPC 路由返回字段和前端期望不一致大部分情況是 Prisma 的 select 字段沒(méi)有包含前端需要的屬性。這個(gè)編譯期就會(huì)報(bào)錯(cuò)很容易修但有一個(gè)隱蔽場(chǎng)景你給某個(gè)字段起了別名或用了 include 關(guān)聯(lián)查詢返回結(jié)構(gòu)嵌套層級(jí)變深前端可能拿不到嵌套對(duì)象。我的排查建議是優(yōu)先懸停查看data的類型展開把鼠標(biāo)放到變量上看編輯器給出的結(jié)構(gòu)確認(rèn)哪一層開始斷掉的。這個(gè)習(xí)慣比盲猜字段名靠譜得多。4.2 Prisma 遷移記錄的坑migrate dev 與數(shù)據(jù)庫(kù)不同步npx prisma migrate dev偶爾會(huì)卡在生成歷史記錄上尤其是團(tuán)隊(duì)成員各自改了 schema 又拉了別人的遷移文件。我遇到過(guò)的典型報(bào)錯(cuò)是P3005提示遷移記錄與數(shù)據(jù)庫(kù)不一致。處理方式分兩類本地開發(fā)且數(shù)據(jù)不重要時(shí)可以執(zhí)行npx prisma migrate reset它會(huì)把數(shù)據(jù)庫(kù)重建到最新 schema代價(jià)是清空所有數(shù)據(jù)如果數(shù)據(jù)需要保留就只能手工檢查 migrations 文件夾里的 SQL 文件確認(rèn)哪一條沒(méi)有成功應(yīng)用然后手動(dòng)執(zhí)行補(bǔ)丁。這里我給一條經(jīng)驗(yàn)項(xiàng)目初期就把遷移文件當(dāng)成代碼一樣審查每次提交prisma/migrations/目錄里的新增文件時(shí)打開看一遍 SQL 內(nèi)容確認(rèn)字段類型、索引、外鍵都符合預(yù)期。數(shù)據(jù)庫(kù)是長(zhǎng)期資產(chǎn)遷移歷史的混亂比代碼混亂的代價(jià)高一個(gè)量級(jí)。4.3 NextAuth 與 tRPC 的上下文時(shí)機(jī)session 怎么取集成 NextAuth 時(shí)不少同學(xué)發(fā)現(xiàn)protectedProcedure時(shí)而有效時(shí)而無(wú)權(quán)訪問(wèn)。排查時(shí)先確認(rèn) tRPC 的上下文創(chuàng)建函數(shù)里是否按需注入了 session// src/trpc/server.ts export const createTRPCContext async (opts: { headers: Headers }) { const session await getServerSession(authOptions); return { db, session, ...opts, }; };這個(gè)getServerSession只能在服務(wù)端組件或 API 路由里調(diào)用。如果你在客戶端調(diào)useQuery時(shí)把 session 手動(dòng)塞進(jìn)去反而會(huì)破壞 tRPC 的封裝鏈路。正確做法是所有受保護(hù)路由都在服務(wù)端上下文里讀取 session前端只需關(guān)心有沒(méi)有 token不需要自己傳 session。另外一個(gè)容易踩的坑是 NextAuth 的authOptions定義在src/server/auth.ts而你注意到 create-t3-app 腳手架生成的路徑里可能有 plan 或 edge 兼容問(wèn)題。不要為了省事把 authOptions 復(fù)制到多個(gè)文件保持單一來(lái)源否則 session 校驗(yàn)邏輯不一致會(huì)出現(xiàn)登錄了但 tRPC 說(shuō)沒(méi)登錄的詭異現(xiàn)象。4.4 環(huán)境變量校驗(yàn)運(yùn)行時(shí)發(fā)現(xiàn)變量缺失腳手架默認(rèn)生成env.js做環(huán)境變量運(yùn)行時(shí)校驗(yàn)這其實(shí)是個(gè)被很多人忽略的救命設(shè)計(jì)。本地啟動(dòng)時(shí)如果缺少DATABASE_URL會(huì)出現(xiàn)帶堆棧的報(bào)錯(cuò)指向 PrismaClient 初始化那行。很多人會(huì)以為 Prisma 裝壞了其實(shí)只要檢查.env文件即可。我建議在生產(chǎn)構(gòu)建前先執(zhí)行一次next build如果 env.js 的校驗(yàn)失敗構(gòu)建會(huì)直接中斷。這個(gè)特性讓你在部署之前就發(fā)現(xiàn)配置缺失而不是容器跑起來(lái)后靠日志排查。注意 env.js 里定義的變量必須與.env.example保持一致否則新同事加入時(shí)復(fù)制示例文件后仍然缺變量。養(yǎng)成把新增變量同步到.env.example的習(xí)慣團(tuán)隊(duì)協(xié)作時(shí)能省很多溝通成本。4.5 Tailwind 類名好像沒(méi)生效內(nèi)容路徑配置Tailwind 的 JIT 模式掃描文件是有范圍限制的。如果你把組件放到腳手架默認(rèn)的src/components之外或者新建了一個(gè)不在掃描路徑里的目錄樣式就編譯不進(jìn)去。這個(gè)問(wèn)題最常見于 monorepo 結(jié)構(gòu)你有一個(gè)獨(dú)立的 ui 包Tailwind 在應(yīng)用層沒(méi)有掃描到那個(gè)包的路徑。解決方案是在tailwind.config.ts里補(bǔ)充 content 配置content: [./src/**/*.{js,ts,jsx,tsx}, ../../packages/ui/**/*.{js,ts,jsx,tsx}]改完后重啟開發(fā)服務(wù)器Tailwind 才會(huì)重新掃描文件。另外注意 class 名不要拼成動(dòng)態(tài)字符串比如bg-${color}-500這種寫法Tailwind 無(wú)法在編譯期識(shí)別樣式必然丟失。這也是很多人寫死 class 都有樣式、拆成變量就失效的根源。結(jié)尾t3code 還可以這樣擴(kuò)展我個(gè)人在實(shí)際開發(fā)中的體會(huì)是t3code 這套組合最難得的地方不在于某個(gè)單一技術(shù)多強(qiáng)大而在于它把類型安全的理念貫徹到了數(shù)據(jù)鏈路的每個(gè)環(huán)節(jié)。這里最后分享一個(gè)擴(kuò)展方向當(dāng)團(tuán)隊(duì)業(yè)務(wù)復(fù)雜度上來(lái)后會(huì)需要給公開頁(yè)面做一個(gè)獨(dú)立的 React Native 應(yīng)用這時(shí) tRPC 就不是唯一通道了我會(huì)在 t3code 的體系之外另起一個(gè) BFF 層用 Hono 或 Fastify 包裝一部分帶鑒權(quán)的 REST API供移動(dòng)端使用。這不意味著放棄 t3code而是把傳統(tǒng) API 保留在外部邊界讓內(nèi)部核心邏輯繼續(xù)享受這套類型安全體系帶來(lái)的紅利。希望這篇文章能幫你少踩一些坑建議你拿記賬本這個(gè)例子親手跑一遍跑通之后再替換成自己的業(yè)務(wù)字段很快你就能理解這套技術(shù)棧的設(shè)計(jì)精髓了。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
最近二区三区视频大全| 啊啊啊啊嗯嗯嗯用力好爽| 日本福利社| 亚洲国产青青| 激情接吻视频久久久久久| 日韩精品熟妇| 吖在线不卡一区二区国产剧情| 国产丝袜视频| 欧美日韩中文视频播放| 丰满翘臀美女影院视频| 97在线看| 熟女网站最新| 91久久久久久久久18| 青青草久草AV| 人妻99p| 91超碰碰在线| 丁香六月东京热| 熟女一区二区三区| 97人妻免费中文字幕| 亚洲欧美天堂| 亚洲男人的天堂亚洲| 欧美在线|亚洲| 18禁中文字幕| 日本一久是| 精品人体无圣光凹凸| 躁躁日曰躁2020| 国产狂喷潮在线精品| 99热在线不卡| 99久久网站| 91欧美www| 色婷婷在线视频| 天天综合网~91| 老鸭窝亚洲毛片| 又大又大又大又粗爽高潮观看| 欧美AB在线观看| 午夜性刺激视频免费观看| 欧美性,亚州色| 日本三级A片网站com| 最新av在线| 天堂中文日本在线观看| 久九九九| 亚洲精品国产精品乱码不卡| 青青操轻轻| 久久精品超碰| 欧美亚洲AN| 懂色AV蜜臀无码精品APP| 中文字幕在线免费观看视频| 久久久无码视频| 爱干爱射网啊啊啊| 在线观看AV片| 91天堂| 欧美天堂日韩三级国产传媒| 国产高清MV操逼视频| 欧洲站一级二级三级h| 九九热视频在线观看| 国产一级舔足在线观看| 97资源站久久| 久久久婷| 亚洲色图久久精品蜜| 日韩精品在线放| 国偷自 一区| 99青草| 99久久e免费热视| 日产精品久久久一区二区| 欧美老熟另类| 破苞ⅩXXX性无码动漫无码| 美女91在线| 欧美性区| 激情五月综合| 涩涩这里只有精品视频| 91骚熟女| 久夜操| 久久m| 久热99| 日本日逼高清| 国产美女高潮| 9美女超碰在线免费观看| 日韩天堂av电影在线观看| 在线观看色视频| 欧美AAAA黄片| 亚洲综合91| 大香蕉92| 97在线欧洲| 日韩高潮一区| 看日韩操逼| 日韩免费三级黄片电影| 亚洲综合888| www99热| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 一本一首道人妻少妇免费久久| 国产亚洲色婷婷久久99精品91葵花宝典| 啊啊啊好想要| 久久久久久久久999| 久久久久久久久久黄色网| 亚洲AV无码AV吞精久久久久| 亚洲男人综合| 97亚洲在线| 欧美综合 站| 国产夜夜艹| 丰满人妻一区二区三区| 国产女生在线| 91成人久久| 国内毛片国产欧美拍| 偷拍亚洲| 国产在线视频午夜精华在| 清纯唯美第一页| 亚洲国产中文字幕| 午夜毛片高清免费不卡| 青青草伊人久久| 亚洲美女精品| 日本999精品视频| 天天操av懂色| 校园春色 男人天堂 | 激情五月综合网| 操逼网站地址| 最新日韩黄片| 天天日天天干天天整| 色狠狠 - 百度| 精品国产91av一区二区三区| 成人精品久久久午夜福利| 欧美日韩资源| 欧美色偷偷| 亚洲欧美色图| 韩国三级一线观看久| 污色区网站| 欧美18老人禁| 欧美天天干| 日韩无码a片| 少妇3P性爱自拍| 韩国一级婬片A片无码天美| 日韩免费看在线黄色片| 强奸乱伦大香蕉| 国产成人亚洲精品无码古代早漏男| 天天插夜夜操| 亚洲高清无码在线桃色| 日本精品第一视频在'| 五月天玖玖资源站| 色五月婷婷色| 色妺妺在线视频| 久悠悠av| 9久9久9久9久视频网站| 亚洲欧美不卡线| 大香蕉欧美| 思思久热在线精品66| 国产黄色在线播放观看| 无码日韩人妻av一| 欧美色偷拍| 超碰人妻久久人妻中文97| 国产少妇高潮| 久久色网| 十八岁啪啪视频免费看| 啊啊啊啊啊啊啊国| 97超碰免费人人性爱| 国产外初女出血视频| 88在线一区二区三区| 91色香| 久久riav中文精品| 色99色| 江都AV在线| 另类图片亚洲加勒比另类图片亚洲加勒比另类图片亚洲加勒比 | 国产懂色精品国产av| 激情色播| 少妇与黑人高潮在线| 1024午夜激情男人的天堂| 日本幼女18+| 国产一国产一级毛片古装| 狠狠操,使劲操| 亚洲h片在线免费观看| 无码乱人伦中文视频| 五月天偷拍| 免费人人搞97| 欧美色91| xxxx网站亚洲精品| 99re不伦| 秋霞午夜成人福利片片| 九九热免费在线国产视频伊人五月| 人妻蜜桃臀| 91在线色综合| 手机看片1024你懂的国产| 天美传媒精品一区二区| 色情婷婷久久五月天| 欧美激情五月天| 日韩成人在线性爱视频| 亚洲97| 98福利在线视频| 大香蕉色十月| 日本综合久久| 欧美日本中字另类在线| 欧美中文字幕日韩在线| 欧美日韩久久精品爱爱| 久久久久久久97| 欧美综合亚洲| 风韵犹存大大大大香蕉| 天天日天天干天天摸天天操| 日日AAvv| 青青草久久| 97这里都是精品| 欧美亚洲综合色| 亚洲综合中文字幕有码| 国产精品宅男免费| 美国人人操人人操| 超碰国产精品久| 五月丁香黄色网| 天天久久| 加勒比综合网| 黑人精品一区二区在线播放| 桃花色综合影院| 日韩亚洲欧美中文字幕| 啪啪综合网| 亚州欧美色图| 久久AV无码AV| 色综合久久av| 中文字幕日韩人妻视频一区二区三区 | 亚洲AV永久无码一区仙野| 国产日逼视频| 日韩性爱毛片操骚逼| 欧美激情性久久久久久| 国产福利视频精品视频| 午夜精品五区| 曰韩无码777| 久久性视频| 九九Av| 欧美性天天影视| 色香阁在线| 久久国产精品91| 熟女少妇一区二区三区| 蜜臀中文字幕| 超碰精品国产无码| 丰满人妻无码一区二区三区 | 怡春苑东京热| 少妇高潮喷水无套久久久久久| 日本中文字幕熟妇| 久久精品无码一区二区三区| 999久久久免费精品国产牛牛| 中文字幕av亚洲精品| 超碰精品日韩欧美国产| 黄色片大香蕉| 五月黑AⅤ| 思思热影视| 911粉嫩人妻| 99热99在线播放激情| 妺妺跟我一起洗澡没忍住| 欧美日韩久久精品爱爱| 成人小说另类在线| 亚洲成人精品久久久| 国产精品亚洲四五区在线观看| 欧美精品 - 91爱爱| 麻豆a'v电影| 久久无码精品| 亚州免费啪啪视频| 这里有精品| 99在线视频播放| 青青操日韩| 免费试看60秒| 无色无码| 久久国99999| 久欲AV| 97精品国产| 中文字幕中文字幕一区二区| 亚洲天堂综合AV| baiduhicn.com。| 欧美精品不卡一二三四在线91| aa片毛片| 91精品久久久久久77777| 91麻豆天美传媒HD| 亚洲丝袜二区在线| 性在久久久久久| 九九综合| 91在线国产后入风骚翘臀美女素人| 久九色| 性色av蜜臀av色欲aV| 天美传媒国产原创中文字幕亚洲欧美另类 | 6080YYY午夜理论片在线观看| 丁香色色网| 青青青艹在线视频| 精品人体无圣光凹凸| 色综合91| 久久夜夜| 欧美在线官网| 九九热精品| 男人的亚洲天堂| 极品销魂美女一区二区| 久久大香蕉手机高清| 欧美日韩小说| 亚洲色欲天天人妻无码系列专区| 国产丸一视频| 日韩欧美国产一区二区三区四区| 久久亚洲人妻| AV不卡在线| 99热导航| 久思思热视频在线观看| 中文字幕人妻色偷偷久久皮 | 国产精品麻豆视频网站| 国产欧美日产一区二区三区 - 国产欧美日 | 综合欧美色图| 性色一线| 少妇被c 黄 免费观看| 亚洲日韩精品在线播放| 男人的天堂VA| 日韩乱码av| 亚洲国产97| 97人妻色| 激情五月天插| 成人精品欧洲亚洲| 岛国成人av在线播放网址| 97资源站久久| 久久XX| 日韩天天综合| 九九九九九九九精品视频| 97色综合中文网| 蜜乳成人AV| 丝袜AV一二三区| 亚洲激情视频| 久久国产精品,久久国产| av毛片aaaaa免费看| 青青草在线视频人人想人人上| 久久精品人妻一区| 精品九九淫乱男| 国产高清成人传媒影视| 91天堂| 亚洲情色五月天| 国产精品网址| 亚洲色图欧美色图在线播放| 国产又粗又又黄又猛| 日本 欧美 亚中文字幕| 自拍偷拍亚洲熟女妇人精品| 国产精品午夜精品| 亚洲 欧美 中文 日韩超碰| 日本成人免费一区二区三区| 嗯~啊~轻一点 视频| 91婷婷伊人狠人| 国产辣妈在线视频福利| 国产一区二区在线看| 久久极品一区二区| 成人亚欧免费视频| 夜草网站| 96超碰网| 台湾佬中文娱乐网久久久久久久久久com | 日韩有码一区三区| 欧美日韩 强奸乱伦| 97国产|免费| 好屌色综合| 婷婷久草一区二区三区| 亚洲AV无码AV吞精久久久久| 青草一区二区| 久久人人爽av亚洲精品天堂桃色| 97资源制服丝袜| 加勒比在线视频一区二区三区| 可乐操亚洲蜜911| 嗯嗯啊啊亚欧精品| 日韩素人无码一区二区三区三州| 国产成人免费观看在线视频| 丁香五六月啪啪| 97在线播放| 天天香香欲综合| 精品久久久亚洲AV成人网站| 精品人妻一区二区视频| 天天综合有色网| 欧洲色| 两性色网| 国产精品一区二区三区,亚洲综合| 麻豆成人影音在线| 神马久久久久久久久| 熟女网站最新| 日本A级视频| 午夜精品久久久久久久男人的天堂 | 国产精品午夜高潮呻吟久久av| 综合网~91综合网| 少妇啪啪自拍| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 日韩精品三区四区| 日本一本一区二区三区四区五区欧美日韩中文字幕| 999国产精品999| 91c色| 成人小说视频在线精品欧美| 国产精品嫩草影院午夜两性| 亚洲精品一区二区精华| 大香蕉视频一二三区| 99999精品| 99re在线| 亚洲第一页第二页激情| 国产精品白领在线观看| 看免费一级在线播放毛片| 91在线免费精品视频| 天天色欧美| 啊啊啊啊操死我| 日本二三四区| 亚洲人综合19| 啊啊啊啊网站| 国产成人91一区二区三区| 日韩免费a级毛片无码a∨| 男人的午夜天堂| 人人妻人人操人人乐| 五月天综合| 丁香五月婷婷色| 99热婷婷| 国产精品久久9| 嗯……啊…嗯嗯…啊…好舒服| 少妇国产不卡| 免费97视频| 日本亚欧爱爱| 国产农村妇女精品| 免费1级a做爰片观看| 亚洲1区2区三区高清中文字幕| 91人妻中文| 亚洲中文一区二区三区视频| 婷婷五月天补不补| 国产青视频| 超碰97在线色男人??| 四虎884| 综合欧美亚洲| 深夜国产一区二区三区在线看| 好爽要喷了| 3级毛片一二| 天天躁日日躁狠狠躁| 国产成人超碰在线| 99热只有这里有精品| 国产毛片精品一区二区色欲黄A片| 欧美综合97www| 91久久久老司机| 欧美 色 亚洲| 精品午夜福利国产一区二区在线观看 | 热99这里只有精品| 亚洲国产剧情少妇激情| 久草久日| 亚洲图片日本AⅤ欧美在线| 欧美日韩国产色图在线| 久久av网| 中文乱码字幕观看视频| 精品一区二区综合熟妇| 精品无码久久久| 加勒比色综合| 午夜国产综合视频在线观看| AV 少妇 人妻 偷拍| 精品乱码久久久久| 91骚熟女| 久久色情| 死我十八禁| 97亚洲性爱| 久久人妻少妇| 男女做爰猛烈动高潮A片免费应用| 九九香蕉网| 天美精品一区二区三区四区在线观看| 91A欧美电影网站| 最新中文字幕在线亚洲| 人人综合| 亚洲一区日韩精品中文字幕| 97婷婷色| 男人的天堂1024| 日本色色色视频| 黄色二级片网站| 蜜臀久久99精品久久久久久婷婷| 日本www操操操| 你草精品在线视频| 久久久久亚洲三级电影| 国产suv精品一区二区四区999 | 女人被添高潮免费视频| 久久久久网站-538在线视频-欧美永久乱码 | 天天躁日日躁xxxxx| 91大神电影天堂| 亚洲高清自拍| 美女啊啊啊啊pc| 九九久久玖玖| 国产日韩精品一区二区三区| 麻豆美女丝袜人妻中文| 人妻夜夜爽天天爽麻豆三区网站| 狠狠爱夜夜| 97色婷婷| 久久天堂| av亚洲天堂资源网站| 亚洲āv网址在线观看| 啊啊啊啊啊啊啊国| ,成人免费啪啪视频| 超碰这里只有精品| 久久亚洲AV无码专区首页| 久久久99999久网站| 久久成人国产精品| 999 久久久| 操逼片中文| 久久青娱乐| 99热精品在线| 精品国模无码| 99热大香蕉伊在线| 国产无套粉嫩白浆在| 女生看匆91网站| 97精品国产97久久久| 久久男人天堂| 天天综合网入口~91| AV网站高清无码在线观看| 少妇特黄一区二区三区| 国产精品色色| 色色激情五月天| 久久草草欧美精品| 精品人妻一区二区三区鲁大师| 欧美性特| 小日子操bb在线看| 欧美日韩制服| 亚洲宗合电影| 国产99久久99热这里只有精品15 | 欧美姓爱综合网| 日韩人体偷拍| 日韩欧美午夜视频在线| 国产伦精品| 操逼内射干逼白丝91| 一区二区三区四区免费视频| 男人的天堂一区| 久久曰曰| 九九在线视频| 大香蕉黄色一级片免费看| 久草线上视频免费看| 加勒比无码一区二区三区| 51国产午夜精品视频| 国产麻豆一区二三区| 丝袜美腿诱惑亚洲欧美视频在线观看 | 2023天天操夜夜操| 亚洲在线91| 欧美日韩人妻婷婷一区| 女人爽到高潮久久久| 国产精品久久久久久照片| 高清视频一区| 久久久神马影院| 男人天堂.AB| 欧美人人AAA| 午夜男女爽爽爽影院视频| 91熟女视频网| 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | 欧美日韩人人早| 插欧洲美女欧美精品| 人人看人人插| 欧美高清色| 亚洲清纯唯美| 清清草影| 亚洲狼狼干综合1| 九九热视频在线观看| 日日操丁香五月天| 国产精品99精品视频网站| 亚洲欧美日韩不卡人妻| 蜜桃臀一区二区三区久久| 97硬碰| 精品妇女一区二区三区| 97色在线| 爱我干综合| 大色综合网| 天天色天天干天天射| 欧美人与动性人交a| 久久人| 日韩精品-原创伙伴| 一卡二卡在线播放| 97色欧洲| 国产怡红院在线| 日日妻色网| 熟女AV一区| 久久精品视频在线观看| 操b网站亚洲无码| 日本精品人妻少妇一区二区| 欧美日韩国第一区| 欧美精品丝袜久久久中文字幕| 精品妇女一区二区三区| 久久精品视频久久久| 亚洲色堂免费视频| 97欧美精品综合| 色第一页| 欧美色综合图片| 色眯眯av| 亚洲第二页| 欲色综合| 色姑娘综合网| 91在线精品一区二区三区| 五月天婷婷在线看| 人人看欧美性爱| 国产亚洲精品农村妇女| 看一级特黄a大一片| 日美免费黄片| 激情婷婷丁香| 欧美少妇内射| 色老久久| 久午视频| 飘花国产午夜精品不卡| 国产第25页在线观看| 婷婷亚洲综合| 中文字幕制服欧美久久一区| 九一综合网| 天天干1区2区在线| 国产精品久久久久久久久久久久| av毛片aaaaa免费看| 人妻干天天| 96久久精品一二三区色欲| 国产超碰| 亚洲码和欧洲精品激情系列| 黄久久| 老司机射| 亚洲一区中文精品| 免费黄色片。| 成人av免费观看| 欧美三级一级| 夜夜嗨免费视频| 蜜臀久久99精品久久久久久酒店 | 欧美中文字幕日韩在线| www.av在线观看| 久久人人妻| 91嫩草在线| 男人的天堂2018| 中文字幕一区电影在线观看| 91蜜臀熟女| 久久精品91| 美女天天干| 国产自偷自拍一区| 日本东京热大香蕉a片| 色噜噜日韩精品| 18禁无码永久免费无限制| 亚洲av乱伦色图网站| 欧美日韩免费专区在线| 国语精品av| 国产精品久久99日日| http://qxhbdz.com| 青青草国产一区二区三区| 亚洲视频中文一区| 婷婷97| 手机av亚洲丝袜美腿日韩第一页二页| 热思思免费视频| 五月激情啪啪| 亚洲第一男人天堂| 亚洲国产欧美另类自拍| 宅男午夜在线视频| 高潮内射在线| 真实高潮91| 91麻豆天美国产欧美高潮| 爱妃国产亚洲视频中文字幕| 激情婷婷五月天| 欧美亚洲韩国视频十五区 | 亚洲午夜福利在线影院| 禁十八久久| 青草成人免费视频一com| 精品人人插人人操| 久欲AV| 天天操天天射天天日| 厕所偷拍在线| 美女裸体无遮挡永久免费观看网站| 九九色热| 欧美91变态| 天天天天干| 久久久精选| 9久久精品| 国产乱码久久久| 日本日皮视频逼| 欧美综合色综合| 午夜理论片在线观看免费| 麻豆 亚洲 97| 浪人综合网| 亚洲色图第一页| 激情视屏国产乱伦强奸| 日本最新1区2区3区| 欧美日本中字另类在线| 男人的亚洲天堂| 亚洲成人无码影院| 国产精品乱码久久久久久| 可能人人看人人摸| 亚洲天天精品| 99综合视频| 色综九九九一区| 久久久久久人妻| 人妻天天爽夜夜爽2| 国产精品久久久无码AV网站| 97久久久精品| 亚洲成人日韩小说| 丝袜视频网国产90| 超碰97起碰| 色综合国产在线观看| 麻豆性爱视频在线播放| 在线综合色| 欧美亚洲首页| 精品人妻夜夜草| 激情网色| 蜜臀久久久99久久久久 | 色牛牛AV| 亚洲天天操| 欧美久久久15P| 亚洲日韩美女中文字幕乱| 成人资源中文字幕在线观看| 欧洲天天在线| 淫荡熟女乱伦网| 97操B| 欧美色图亚洲色图成人在在线| 亚洲精品毛片在线观看| 超碰导航97| 淫色网综合| 精品国产www久久| 亚洲性网| 国产热av| 日本免费不卡二区| 国产熟女乱论| 亚洲国产精品久久AV| 啊灬啊灬啊灬啊灬高潮奶出了免费视 | 天天色天天干天天射| 97色97好| 黄网在线播放| 精品久久无码午夜福利| 欧美综合综合| 99久热精品99re6热| 少妇一区二区三区在线观看| 天天碰操中国年青熟妇| 乱伦系列一区二区| 国产又粗又大硬免费色网视频| 男人天堂免费| 欧美无圣光在线| 综合婷婷| 日韩乱伦视频| 无码外流操逼视频| 久久久久久久97| 中出人妻中文字幕91在线| 欧美 亚洲 大香| 五月天婷婷成人网| 唐山老熟妇露脸啪啪叫| 久久 国产 无码| 91一区二匹| 国产蜜臀精品一区二区尤物| 色老牛| 日韩三级网址| 99精品免费| 性做久久久久久免费观看软件| 中文字幕一区二区三区四区在线视频| 亚洲丝袜少妇在线| 黑人精品欧美一区二区蜜桃| 熟妇国产免费一区| 熟女欧美日韩综合婷婷| 久久理论字幕视频| 天天插天天干| 99操| 大香蕉综合网| 99热最新| 久久成人网站| 欧美少妇性乱| 99精品伊人| 丁香婷婷激情五月天无毒不卡| 极品丝袜无码| 99久久com免费视频′| 婷婷五月丁香五月| 好吊妞转入那个网| 水澄无码AV| 韩国久久97| 最新加勒比丝袜在线| 伊人AAA| 亚洲老熟妇xxx| 中文无码一二三区| 亚洲情色五月天 | 久久国产性爱| 性影在线视频| 亚洲欧美在线观看2021| 91在线精品| 韩国一级婬片A片AAAAA| 精品婷婷| 99少妇精品视频| 人妻一区二区三区| 青青草日本中文字幕| 97超碰免费人人性爱| 青青草无码视频| 狠狠躁久久躁| 啊啊啊啊啊啊好多水| 9久在线视频只有精品| 欧美一区二区三区互相| 一级aaaaa欧美中文字幕录像片| 欧美十八禁导航成人| 精品一区二区成人动漫| 一区二区三区精品黑丝白丝酒店对鸡| 奸色色 男人天堂 天天射| 欧美综合加勒比在线| 无码男人天堂| 一二三区精品视频| 天天射天天操天天干天天吃2018| 色在线亚洲视频www| 成人国产精品三级A片| 亚洲综合色男人网| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 肉嘟嘟www视频在线观看高清| 婷婷视频网| 日本三级人妻a人妻一在线| 精品一区二区三区四区外站| 久久久一区二区三区麻豆| 男女一进一出视频久久| 综合欧美激情网| 99热精品在线| 无码男人天堂| 麻豆成人影音在线| 99re公开精品免费视频| AA丁香综合激情| 久久超碰97中文字幕| 超碰久久.com| 久久久久久一日韩字幕无码| 婷婷综合网| 欧美白嫩女HD| 男人的天堂久久久| 国产高清成人mv在线观看| 91黑丝在线播放| 亚洲熟女乱综合一区二区三区| 97视频免费| 丰满人妻无码一区二区三区| 国产最新AV| 久久久国产护士丝袜美腿一| 国产亚洲福利第一页丝袜| 日韩无码专区| 色哟哟1区2区| 香港澳门日本三级网站| 狠狠色婷婷| 久久久久久少妇| 婷婷伊人五月| 亚洲激情网一二三四区| 天天影视之亚洲综合网| 成人五级久久| 97亚洲综合电影| 久操视频这里只有精品| 久久肏大逼| 青青欧美| 2017人人操,人人摸| 久久理论字幕视频| 亚洲色交| 91日本在线观看| 夜夜免费视频| 国产无遮挡| 亚洲精品中文字幕一区在线视频| 九一综合精品视品av| 超碰诱惑| 五月香婷婷| 老熟妇一区二区三区| 日本不卡高清视频| 亚洲视频一二区| 色哟哟 日韩精品| 玖玖97综合| 亚洲欧美黄| 天天做天天爱天天高潮| 五月天婷婷社区| 四色永久成人网站| a啊啊啊啊啊啊啊啊一区二区| 黄色免费网页无码| 蜜臀久久99'精品久久久| 日韩激情啪啪啪| 蘋果手機免費看成人Av| 国产精品久久久久久照片| 高跟伊人julia ann| 无码一区二区精品视频久久久春药| 97综合在线观看| 人人看黄色视频| 91在线限制级| 久热精品在线国产| 日本东京热大香蕉a片| 一区二区三区视频国产免费| 中文字幕乱偷人妻久久艾草网| 欧美成人A天堂片在线观看| 天天射夜夜| 99久久久无码国产精品性男| 亚洲猛交| 97天天摸天天碰| 在线a亚洲视频播放在线| 久久国产视频专区一二三 | 又大又黄国产| 亚洲国产美女久久久久| 妇人噜噜| 91精品伊人久久久大香线蕉91| 中文字幕欧洲有码| 2020视频1区2区3区| 狠狠婷婷亚洲中文综合久久| 东北女人| 精品成人av一区二区三区在线| 婷婷丁香人妻 | 97久久国产精品女不卡| 国产青一二三| 午夜AV人气不卡| 91蜜桃传媒精品久久久一区二区| 夜夜爽33333| 人人干人人操人人爱| 久草线上视频免费看| 在线 制服丝袜中出 人妻| 超碰在线欧美性爱激情| 青操影院| 淫淫总合网| 最新中文字幕精品在线| 亚洲欧美清纯| 欲射影视| 91校园春色长篇| 久久久久久69国产一区二区| 午夜操操操| 青青草黑寡妇男人天堂| 欧美色综合影院| 欧美性爱第一页久久| 好色美女九七第一页| av婷婷色网| 国产一区二区在线电影| 91操操操操| 久久精品女同亚洲女同13| 欧美少妇一区二区三区| 国产AV高清AV无码| 综合久久久久久久久91| 五月天人妻综合| 欧美在线伊人色| 超碰人人在线| 3028国产精品| 97超碰人人操人人操| 深爱伊人影院| 欧美熟妇亚洲版| ′ !γ}丶。。久久精品欧美一区二区三区 | 国模一区二区三区| 亚欧性爱ab| 久久精品国产亚洲妲己影视| 九月伊人中文字幕| 乱色老一区二区三区的观看方式| 红桃视频高潮| 日韩精品 资源| 综合久久欧美| 久久av一级av少妇av高潮| 欧美色综合| 久久久91| 中出91视频| 日韩 欧美 国产 麻豆| 自拍盗摄一区| 日本人体九九九九九九| 丁香五月天激情网站| 国产极品99热在线播放69| 澳门黄片一香蕉视频| 大香蕉欧美| 酒色综合网| 日韩欧美中文字幕搭讪巨乳美人妻视频| 97国产天堂岛| 91视频成人福利网站在线一区| 91亚·色| A V少妇特黄三级| 操人91| 亚洲欧洲网站免费观看| 美女国产一区二区久久| 操逼逼中文字幕| 免费一级黄色录像影片| 一本精品日本在线视频精品| 亚洲 小说 欧美 激情 另类| 91福利网在线观看| 国产在线播放成人免费| 国产一国产一级毛片古装| 精品91日日夜夜超清资源| 天天干人人乐| 天天亚洲| 人人操人人色网| 热99这里有精品综合久久 | 无码免费在线观看黄色片| 亚洲日韩人妻中文字幕一区| 免费AV中文网在线观看| 亚洲精品国语在线播放| 亚洲欧洲中文日韩女优乱码| 日本人妻中文字幕精品| 特级特黄一级毛片免费| 美国黄片aaa| 嗯啊视频免费在线观看| 超碰97首页| 99∨VTV| 日本精品不卡一二三区| 免费簧片在线观看| 强免费黄色网址| 久热精品在线| 成年在线视频日本亚洲在线视频区精品江靖宇公司 | 免费观看的av| 天天色香欲综合网| 高清不卡视频| 夜草欧美| 日韩特一级久久| 午夜亚洲| w w w.久久精品| AV一起草在线| 欧美亚洲另类在线蜜桃| av一区二区三区 中文| 能看的AV| 国产精品网站www| 夜夜骑操视频| 97久久国产精品女不卡| 12一15性XXXX粉嫩国产| 国产精品久久久久无码A√| 亚洲中文字母在线播放| 超碰三级秋霞| 99re这里| 欧美亚洲手机在线| 国产一区免费午夜视频| 强奸乱亚洲| 人人澡人人爽人人精品| 亚洲AV在线资源| 久久久亚洲熟妇熟女| 欧美一级久久久丰满| 色婷婷99| 躁躁日曰躁2020| 97国产|免费| 亚洲男人久久综合天堂| 欧美疯狂做爰xxxx| 一区麻豆 高清中文字幕| 日韩欧美蜜桃精品久久中文字幕久久| 欧美激情专区| 亚洲色 国产 欧美 日韩| 精品国产乱码久久久久久影片| 亚洲黄a三级三级三级看三级| 久9精品| 99久久久er直播网址| 偷拍网站久久男女男| 欧美日韩系列| 亚洲日本激情| www.狠狠干.coom | 久久伊人大香蕉| 麻豆伊人网| 欧美综合另类| 激情五月天社区| 亚洲揄拍网| 男人的天堂2019| 亚洲精品乱码久久久久久蜜桃麻豆 | 国产精品午夜福利| 亚洲另类小说卡通动漫| 少妇无码太爽| 欧美春色| 无码少妇精品一区二区60岁老人| 天天看片麻豆| 玖玖爱在线视频免费观看| 色色色网站| 国产2.3.4区| 日本操逼视频导航| 东京成人一区| 久久精品国产亚洲5555| 91啪啪| 99久久免费看精品国产一区| 国产对白刺激视频| 欧美精品丝袜久久久中文字幕| 高清孕妇孕交 交| 2018色综合天天操| 97欧美色| 精品伊人久久久大香线蕉小说| 91久久国产综合精品| 自拍偷拍国产欧美日韩韩| 老女人日韩美91| 亚洲一二三四区| 久久丁香| 久9无限国产| 欧美1727免费观看视频| 中文字幕在线免费观看 | 亚洲天堂2020| 久久人妻视频网| 蜜臀网 一区| 丰满人妻一区二区三区| 日韩91网| 日本色婷婷| 色九久| 日韩乱码Av| 国产一区二区二区按摩精品啪视频| 91色艳| 日韩性爱啪啪视频| 日本一区二区三区欧美日韩中文字幕| 无码人妻精品酒店| 久久久精久久久| 国产精品爱欲| 青青草男人天堂| 亚洲 一区二区 自拍| 日产成人久久| 九色婷婷| 我要色综合网| 欧美日韩222| 2020中文在线一区二区三区| 视频二区熟女人妻| 日本国产成人亚洲精品无码| 狠狠爱夜夜| 国产精品九9| 成人一级性爱| 视频在线观看青青99国产| 柠檬AV导航| 91老熟女视频| 青青草啪啪网| 国产成人精品日本亚洲语言| 久9精品| 国产久久日韩网站导航| 欧美另类综合久久| 精品日日人妻| 欧美少妇一区二区三区| 欧美亚洲第一页| avav青青草久久夜| 久操九九九九| 最新三级网址| 少妇天堂| 天天干天天日天天射黄色片| 色爱三区| 嗯嗯啊啊操我| 久久草视频污视频| 色色99| 天天操天天射天天日| 中文字幕青青草| 99国产天美| 午夜福利成人免费视频| 国产精品香蕉| 97视频在线免费播放| 欧美|91色综合| 伊人久久综合精品欧美| 亚洲综合伊人无码久久| 狠狠操一区二区| 婷婷色婷婷| 一本大道不卡一二三区| 亚洲狠| 在线观看午夜婷婷久久久久清性观看| 这里只有精品视频| 国产专区第一页| 亚洲情色综合| 激情视频图片| 美女91在线观看| 99热这里都是精品| 欧美大香蕉同搞| 欧美色宗合| 九九九偷拍| 性色av一区二区| 欧美黑人性猛交91| av一区二区三区 中文| 欧美偷拍区| 超碰在线一区二区| 超碰97综合网| 欧美亚州综合图片| 五月天黄色av| 色婷婷影院| 国产精品午夜福利视频| 97综合在线观看| 天天日天天插| 免费黄色A片| 久久黄色性爱视频| a片久久久久久久久久久久 | 亚洲情色一区三区| 五月色综合| av片在线观看免费播放| 可能人人看人人摸| 欧美爱三级日韩久久| 欧美亚洲| 成人怡红院| 午夜在线播放| 亚洲 日本 不卡| 美女黄色91| 国产深喉| 免费精品AB| 性色高清..……| 天天操天天日青青草超碰av| 欧美伦乱爱| 美美91成人国产精品欧美精品久久久久久久| 嗯嗯嗯嗯啊啊啊好紧好大| 夜夜肏2021| 日韩国语字幕| 亚洲欧洲偷拍一区| 九色97| 久久久久精| 亚洲AV无码| 国产老熟女| 欧美色图偷拍另类| 久久久久久久久九九久孕交| 黄色小说亚洲| 求求你操操我| 大肉棒导航| 久久久精品一区二区| 亚洲在钱| 啪啪啪男女亚洲中文字幕99| 九九九成人| 999精品女人| 久久免费少妇| 国产欧美在线观看免费观看| 久久精品国产亚洲AV清纯| 亚洲国产精品无码AV久久久| 日本一区二区三区午夜观看| 国产最新小视频在线播放下载 | 嗯,啊。舔我逼| 日韩无码服务区|