亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

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

t3code全棧樣板工程:以類型安全重構(gòu)前后端聯(lián)調(diào)鏈路

t3code全棧樣板工程:以類型安全重構(gòu)前后端聯(lián)調(diào)鏈路 1. t3code在解決什么問題一次全棧項(xiàng)目選型的真實(shí)算賬t3code是我在GitHub上維護(hù)的一套全棧樣板工程核心思路很樸素把 Next.js、TypeScript、tRPC、Prisma、Tailwind 這五個(gè)工具以類型安全為共同主線串成一個(gè)開箱即用的底座。很多人第一次看到 T3 Stack 會(huì)覺得它是網(wǎng)紅技術(shù)棧真正用起來(lái)才發(fā)現(xiàn)它解決的問題非常具體——前后端聯(lián)調(diào)時(shí)那種接口文檔寫了等于沒寫、改個(gè)字段兩邊同時(shí)炸的尷尬在 t3code 這套架構(gòu)里會(huì)大幅減少。1.1 傳統(tǒng)分工模式里類型斷裂的代價(jià)被低估了先說(shuō)說(shuō)我為什么最終選了這套方案。早幾年做全棧項(xiàng)目最常見的結(jié)構(gòu)是前端一個(gè)倉(cāng)庫(kù)、后端一個(gè)倉(cāng)庫(kù)前端用 Axios 手寫接口調(diào)用后端用 Swagger 出文檔。這種模式在項(xiàng)目小的時(shí)候很順暢一旦業(yè)務(wù)復(fù)雜起來(lái)問題就暴露了后端改了接口返回結(jié)構(gòu)前端只要沒及時(shí)更新類型定義運(yùn)行時(shí)大概率直接拿不到字段。接口文檔要么沒人維護(hù)要么反序列化類型和真實(shí)返回根本對(duì)不上聯(lián)調(diào)階段一半時(shí)間在扯皮。所有接口調(diào)用都得手寫一遍類型聲明一百個(gè)接口就是一百份重復(fù)勞動(dòng)模板代碼多到讓人麻木。t3code 這套東西最核心的思路就是把這些手寫類型的環(huán)節(jié)改成自動(dòng)推導(dǎo)。數(shù)據(jù)庫(kù)表結(jié)構(gòu)由 Prisma 的 schema 定義類型從 schema 生成后端接口由 tRPC 的 router 定義前端調(diào)用方可以直接復(fù)用同一套類型。換句話說(shuō)類型不是人寫的而是從源頭流出來(lái)的。我第一次跑通這條鏈路的時(shí)候感覺最明顯的變化是前后端對(duì)字段的理解從約定變成了編譯期強(qiáng)制。1.2 選型時(shí)我也對(duì)比過(guò)其他方案不只是跟風(fēng)可能有人會(huì)說(shuō)Next.js 自帶 API Route也可以用 GraphQL為什么偏偏選 tRPC我實(shí)際對(duì)比過(guò)幾種方案方案類型穿透能力學(xué)習(xí)成本服務(wù)端緩存/鑒權(quán)靈活性適合場(chǎng)景REST 手寫類型弱需要維護(hù)兩份代碼低高完全自定義團(tuán)隊(duì)已有成熟規(guī)范GraphQL codegen中等需要生成步驟中高中需要自己處理緩存復(fù)雜聚合查詢、多端復(fù)用Next.js API Route fetch弱仍需額外類型層低高簡(jiǎn)單項(xiàng)目夠用tRPC強(qiáng)端到端自動(dòng)推導(dǎo)中理解泛型需要時(shí)間中高procedure 可包裝鑒權(quán)全棧 TypeScript 團(tuán)隊(duì)真實(shí)體驗(yàn)下來(lái)tRPC 并不是萬(wàn)能的。如果你的項(xiàng)目需要給第三方提供公開 API或者前端不只是 Web 端還有大量小程序/移動(dòng)端REST 或者 GraphQL 仍然是更穩(wěn)的選擇。t3code 的定位是內(nèi)部全棧項(xiàng)目尤其是一個(gè)團(tuán)隊(duì)同時(shí)寫前端和后端的場(chǎng)景。類型穿透的優(yōu)勢(shì)在這個(gè)場(chǎng)景下被放到最大而對(duì)外暴露接口的劣勢(shì)則不太重要。1.3 t3code 的邊界感它不是什么都能干我特別想強(qiáng)調(diào)一點(diǎn)t3code 不是拿來(lái)即用的業(yè)務(wù)框架它更像一個(gè)骨架清晰的最小可運(yùn)行系統(tǒng)。你拿它起步能省掉配環(huán)境、折騰連接、搭建目錄結(jié)構(gòu)的瑣碎時(shí)間但業(yè)務(wù)邏輯還是要自己寫。它也不會(huì)替你決定部署方式、數(shù)據(jù)庫(kù)到底用 PostgreSQL 還是 MySQL、組件庫(kù)用哪個(gè)——這些是需要你自己拍板的部分。如果你正處在一個(gè)想試試全棧 TypeScript但不知道從哪下手的狀態(tài)或者被前后端類型不一致的 bug 折磨過(guò)這篇文章接下來(lái)的內(nèi)容會(huì)很有用。我會(huì)把 t3code 的骨架邏輯、一個(gè)真實(shí)功能的落地過(guò)程以及我在生產(chǎn)環(huán)境里踩過(guò)的坑一條一條拆開講。2. 骨架拆解五個(gè)核心成員是怎么咬合在一起的開始實(shí)戰(zhàn)之前有必要先把 t3code 的骨架邏輯講清楚。這五個(gè)工具各司其職但真正讓它們產(chǎn)生化學(xué)反應(yīng)的是彼此之間的接口設(shè)計(jì)。理解了這個(gè)咬合關(guān)系后面遇到報(bào)錯(cuò)時(shí)你能更快判斷問題出在哪一層。2.1 Next.js 是底座App Router 決定了邊界的劃分t3code 基于 Next.js 的 App Router 構(gòu)建。App Router 帶來(lái)的一個(gè)關(guān)鍵變化是服務(wù)端組件和客戶端組件的邊界。服務(wù)端組件在服務(wù)器上執(zhí)行可以直接訪問數(shù)據(jù)庫(kù)、讀取環(huán)境變量代碼不會(huì)打包到瀏覽器??蛻舳私M件需要標(biāo)記use client在瀏覽器里運(yùn)行負(fù)責(zé)交互邏輯。這個(gè)邊界對(duì)類型安全很重要。t3code 里的 tRPC 在服務(wù)端可以直接調(diào)用在客戶端則需要走一個(gè)專門的 hooks 封裝。你要做的是清晰地區(qū)分哪些邏輯必須在服務(wù)端處理比如直接查庫(kù)、處理密鑰相關(guān)的操作和哪些邏輯必須交給瀏覽器比如點(diǎn)擊事件、表單狀態(tài)。我在剛上手時(shí)經(jīng)常犯的錯(cuò)是把所有組件都寫成客戶端組件導(dǎo)致服務(wù)端該干的事跑到瀏覽器里去干類型倒是沒崩性能和安全性先崩了。2.2 tRPC 是無(wú)文檔的契約tRPC 的特別之處在于它不需要你寫接口文檔也不需要你手寫類型定義。你在服務(wù)端定義了一個(gè) router// server/api/routers/post.ts import { createTRPCRouter, publicProcedure } from ~/server/api/trpc; import { z } from zod; export const postRouter createTRPCRouter({ list: publicProcedure.query(async ({ ctx }) { return ctx.db.post.findMany({ orderBy: { createdAt: desc }, }); }), create: publicProcedure .input(z.object({ title: z.string().min(1), content: z.string().optional(), })) .mutation(async ({ ctx, input }) { return ctx.db.post.create({ data: input }); }), });前端調(diào)用時(shí)類型會(huì)被自動(dòng)推斷出來(lái)連輸入?yún)?shù)的校驗(yàn)規(guī)則都是同一份// app/_components/post-list.tsx use client; import { api } from ~/trpc/react; export function PostList() { const { data: posts, refetch } api.post.list.useQuery(); const createPost api.post.create.useMutation({ onSuccess: () refetch(), }); return ( div {posts?.map((post) ( div key{post.id} h3{post.title}/h3 {post.content p{post.content}/p} /div ))} button onClick{() createPost.mutate({ title: 新文章, content: 內(nèi)容 }) } 新建 /button /div ); }注意這里的api.post.list.useQuery()不是普通的函數(shù)它背后是 React Query 的 hooks。也就是說(shuō)緩存、重試、請(qǐng)求狀態(tài)管理這些邏輯也被 tRPC 的 React 封裝一并處理了不需要你再單獨(dú)引入一套數(shù)據(jù)請(qǐng)求方案。2.3 Prisma 是類型的源頭在 t3code 里數(shù)據(jù)庫(kù)表結(jié)構(gòu)由 Prisma 的 schema 定義。你只要維護(hù)一個(gè)schema.prisma文件Prisma 就能生成對(duì)應(yīng)的 TypeScript 類型和 Client。這意味著數(shù)據(jù)庫(kù)字段變成代碼里的類型這個(gè)環(huán)節(jié)是自動(dòng)的不存在數(shù)據(jù)庫(kù)改了個(gè)字段代碼里忘了同步的問題。generator client { provider prisma-client-js } datasource db { provider postgresql url env(DATABASE_URL) } model Post { id String id default(cuid()) title String content String? createdAt DateTime default(now()) updatedAt DateTime updatedAt }執(zhí)行npx prisma migrate dev之后ctx.db.post.findMany()里返回的post對(duì)象就是帶類型的。這個(gè)類型再被 tRPC 的返回值攜帶一路傳到前端組件整個(gè)鏈路就通了。我在實(shí)際使用中最喜歡的細(xì)節(jié)是改 schema 之后只要重新生成 Prisma Client前端代碼馬上會(huì)報(bào)出所有字段名對(duì)不上的地方這種安全感是傳統(tǒng)接口聯(lián)調(diào)給不了的。2.4 Tailwind 是樣式層但要配合組件規(guī)范Tailwind 在 t3code 里承擔(dān)的是樣式職責(zé)。它本身和上面的類型鏈路關(guān)系不大但它決定了樣板工程的 UI 長(zhǎng)什么樣。我是這么看 Tailwind 的它可以讓你不寫 CSS 文件就完成大部分布局但如果完全靠 utility class 堆頁(yè)面后期維護(hù)會(huì)更吃力。在 t3code 里我會(huì)建議搭配一個(gè)組件庫(kù)比如 shadcn/ui來(lái)收斂樣式原子。Tailwind 負(fù)責(zé)基礎(chǔ)原子類組件庫(kù)負(fù)責(zé)提供結(jié)構(gòu)化的組件業(yè)務(wù)頁(yè)面只關(guān)心數(shù)據(jù)和布局不用每次從零拼按鈕和輸入框。這個(gè)組合用起來(lái)比較順手也不容易出現(xiàn)改一個(gè)按鈕樣式要翻十幾個(gè)文件的窘境。2.5 一張圖看完整鏈路如果把它們的關(guān)系簡(jiǎn)化為一條數(shù)據(jù)流大概是這樣的Prisma Schema → 數(shù)據(jù)庫(kù)表 TypeScript 類型 ↓ tRPC Router → 輸入校驗(yàn) 業(yè)務(wù)邏輯 類型導(dǎo)出 ↓ React Query Hooks → 狀態(tài)管理 緩存 ↓ React 組件 → 渲染與交互這條鏈路的每一個(gè)環(huán)節(jié)類型的承重墻都是自動(dòng)生成的人只負(fù)責(zé)寫業(yè)務(wù)邏輯。理解了這點(diǎn)后面排查問題時(shí)會(huì)非常有用——當(dāng)你看到一個(gè)類型報(bào)錯(cuò)你要判斷的其實(shí)是它發(fā)生在哪一層數(shù)據(jù)庫(kù)層、接口層、還是組件層。3. t3code 實(shí)戰(zhàn)落地從數(shù)據(jù)庫(kù)到頁(yè)面的類型閉環(huán)理論講完接下來(lái)把袖子擼起來(lái)。我用一個(gè)真實(shí)的例子——從初始化項(xiàng)目到實(shí)現(xiàn)一個(gè)帶數(shù)據(jù)庫(kù)寫入和列表展示的完整功能——帶你跑一遍 t3code 的落地過(guò)程。3.1 初始化項(xiàng)目交互式命令行里有哪些選項(xiàng)先說(shuō)明一下如果你要手動(dòng)復(fù)刻 t3code 的結(jié)構(gòu)最直接的方式是用官方腳手架生成一個(gè)同構(gòu)項(xiàng)目npx create-t3-applatest my-app執(zhí)行命令后交互式界面會(huì)問你要不要啟用 Tailwind、tRPC、Prisma、NextAuth 等模塊。我的建議是如果只是學(xué)類型閉環(huán)Prisma 和 tRPC 必須勾上。NextAuth 可以先不勾它處理的是鑒權(quán)邏輯第一次上手時(shí)容易把注意力從類型鏈路上帶偏。Tailwind 建議勾上即使你不用它后續(xù)調(diào)整界面也方便。腳手架生成完之后目錄結(jié)構(gòu)大致是這樣的prisma/ schema.prisma src/ server/ api/ root.ts # 匯總所有子 router routers/ post.ts # 業(yè)務(wù) router trpc.ts # tRPC 實(shí)例與上下文 db.ts # Prisma Client 單例 trpc/ react.tsx # 客戶端 tRPC provider 與 hooks server.ts # 服務(wù)端 tRPC caller可選 app/ api/trpc/[trpc]/ route.ts # tRPC 的 HTTP 入口 _components/ post-list.tsx page.tsx這個(gè)結(jié)構(gòu)本身是 t3code 的核心價(jià)值——它把所有樣板代碼和配置文件都擺好了你不用從空白開始思考tRPC 掛在哪個(gè)文件、Prisma Client 怎么全局共享這類問題。3.2 配置數(shù)據(jù)庫(kù)環(huán)境變量與連接串的講究默認(rèn)情況下腳手架會(huì)用 SQLite 起步但我建議你直接換成 PostgreSQL 或者 MySQL因?yàn)樯a(chǎn)環(huán)境基本不會(huì)用 SQLite。修改prisma/schema.prismadatasource db { provider postgresql url env(DATABASE_URL) }然后在.env里配置DATABASE_URLpostgresql://user:passwordlocalhost:5432/t3code這里有一個(gè)很容易踩的坑不要把包含敏感信息的 .env 文件提交到 Git。腳手架生成的.gitignore通常已經(jīng)幫你把.env排除掉了但如果你是自己手動(dòng)搭的環(huán)境一定要檢查確認(rèn)。數(shù)據(jù)庫(kù)連接串相當(dāng)于數(shù)據(jù)庫(kù)的鑰匙泄露出去就是一個(gè)嚴(yán)重的安全事故。配置好之后在 schema 里加上最簡(jiǎn)單的 Post 模型然后執(zhí)行遷移npx prisma migrate dev --name init這個(gè)命令會(huì)把變更同步到數(shù)據(jù)庫(kù)同時(shí)生成 Prisma Client。如果沒有任何報(bào)錯(cuò)你打開src/server/db.ts里面應(yīng)該是這樣的import { PrismaClient } from prisma/client; const globalForPrisma globalThis as unknown as { prisma?: PrismaClient }; export const db globalForPrisma.prisma ?? new PrismaClient(); if (process.env.NODE_ENV ! production) { globalForPrisma.prisma db; }這個(gè)全局單例的模式很關(guān)鍵。它確保在開發(fā)環(huán)境的模塊熱更新HMR過(guò)程中不會(huì)因?yàn)槊看挝募兏紕?chuàng)建新的 Prisma Client 而導(dǎo)致連接數(shù)暴增。不寫這個(gè)單例開發(fā)到一半你可能會(huì)看到數(shù)據(jù)庫(kù)連接被占滿的警告。3.3 寫第一個(gè) tRPC 接口從 router 到頁(yè)面接下來(lái)定義一個(gè) post router并在根 router 里注冊(cè)// src/server/api/root.ts import { createTRPCRouter } from ~/server/api/trpc; import { postRouter } from ~/server/api/routers/post; export const appRouter createTRPCRouter({ post: postRouter, }); export type AppRouter typeof appRouter;回到之前那個(gè)例子——我們已經(jīng)有l(wèi)ist和create兩個(gè) procedure 了?,F(xiàn)在重點(diǎn)是理解前端如何調(diào)用。在服務(wù)的入口處t3code 已經(jīng)把 HTTP 路由掛好了src/app/api/trpc/[trpc]/route.ts所以前端不需要關(guān)心請(qǐng)求路徑。你只需要在客戶端組件里使用api對(duì)象use client; import { api } from ~/trpc/react; export function PostList() { const utils api.useUtils(); const { data: posts, isLoading } api.post.list.useQuery(); const createPost api.post.create.useMutation({ onSuccess: () utils.post.list.invalidate(), }); if (isLoading) return divLoading.../div; return ( div {posts?.map((post) ( div key{post.id}{post.title}/div ))} button onClick{() createPost.mutate({ title: Hello t3code })} 新增 /button /div ); }這里你可能注意到我沒有用refetch而是用了utils.post.list.invalidate()。這是 React Query 比較推薦的做法讓緩存失效后自動(dòng)重新拉取而不是手動(dòng)觸發(fā)請(qǐng)求。在 t3code 里React Query 的緩存策略可以按業(yè)務(wù)場(chǎng)景定制比如設(shè)置staleTime減少不必要的請(qǐng)求。3.4 類型是怎么流動(dòng)的以及為什么你不會(huì)漏改字段很多人第一次看 t3code 會(huì)有個(gè)疑問前端代碼明明沒有導(dǎo)入任何后端類型為什么posts是帶類型的答案在于 tRPC 的泛型推導(dǎo)。api.post.list.useQuery()的api對(duì)象是createTRPCReactAppRouter()生成的而AppRouter又是typeof appRouter。所以TypeScript 會(huì)把a(bǔ)ppRouter里所有 router 的輸入輸出類型全部推導(dǎo)出來(lái)并注入到前端的 hooks 類型參數(shù)中。這相當(dāng)于一個(gè)全項(xiàng)目的類型地圖前端不需要手動(dòng) import編輯器自動(dòng)補(bǔ)全就能看到返回字段。這套機(jī)制帶來(lái)的實(shí)際效果是如果后端list返回值從{ title: string }變成了{(lán) title: string; content: string }前端除非顯式解構(gòu)字段否則不會(huì)報(bào)錯(cuò)但如果后端改了字段名比如title改成name前端所有用到post.title的地方會(huì)立即標(biāo)紅。這種改錯(cuò)名十分鐘內(nèi)發(fā)現(xiàn)的體驗(yàn)在傳統(tǒng)接口聯(lián)調(diào)里幾乎不敢想。4. 生產(chǎn)環(huán)境最容易翻車的坑和完整的排查鏈路t3code 這套架構(gòu)本地跑得很順但一到生產(chǎn)環(huán)境還是有幾個(gè)高頻問題我一個(gè)個(gè)說(shuō)清楚包括排查思路和解決方案。4.1 數(shù)據(jù)庫(kù)連接被邊緣函數(shù)打滿Prisma 連接池配置如果你把 Next.js 部署到 Vercel 這類邊緣/Serverless 環(huán)境會(huì)遇到一個(gè)特別典型的坑Prisma Client 默認(rèn)創(chuàng)建的連接池和 Serverless 按需啟動(dòng)的短生命周期實(shí)例不匹配?,F(xiàn)象是請(qǐng)求量稍微上來(lái)之后數(shù)據(jù)庫(kù)報(bào)錯(cuò)P1001連接超時(shí)或者后臺(tái)看到大量閑置連接。原因是每個(gè) Serverless 實(shí)例都會(huì)創(chuàng)建自己的 Prisma Client實(shí)例銷毀時(shí)連接池來(lái)不及釋放積少成多。排查鏈路先看日志是不是PrismaClientInitializationError或者連接數(shù)告警。確認(rèn)是否每個(gè) function 實(shí)例都持有了數(shù)據(jù)庫(kù)連接。解決方向有兩個(gè)一個(gè)是在數(shù)據(jù)庫(kù)里把直接連接地址和連接池地址分開一個(gè)是用外置連接池。在我的 t3code 倉(cāng)庫(kù)里推薦的做法是在.env里區(qū)分兩個(gè)變量DATABASE_URLpostgresql://user:passwordhost:5432/db?pgbouncertrueconnection_limit1 DIRECT_URLpostgresql://user:passwordhost:5432/db然后在 schema 里聲明datasource db { provider postgresql url env(DATABASE_URL) directUrl env(DIRECT_URL) }DATABASE_URL走連接池適合 Prisma Client 在 Serverless 環(huán)境里頻繁創(chuàng)建連接DIRECT_URL走直連適合執(zhí)行遷移命令時(shí)使用。遷移的時(shí)候不需要連接池直連更可靠。4.2 tRPC 類型不同步兩端的版本斷裂t3code 的強(qiáng)項(xiàng)是類型穿透但如果你把前后端拆成兩個(gè)倉(cāng)庫(kù)部署或者一個(gè)倉(cāng)庫(kù)里前后端依賴版本不一致就會(huì)出現(xiàn)后端新加了一個(gè) procedure前端類型卻沒更新的情況。這種斷裂在 monorepo 結(jié)構(gòu)里尤其常見。典型報(bào)錯(cuò)是前端調(diào)用api.xxx.yyy時(shí)TypeScript 提示Property yyy does not exist on type ...。排查鏈路確認(rèn)是否運(yùn)行過(guò)npm install確保trpc/server和trpc/react-query版本一致。確認(rèn)src/server/api/root.ts里新 router 有沒有正確注冊(cè)。清掉 TypeScript 的增量緩存npx tsc --noEmit如果仍報(bào)錯(cuò)再看編輯器里的 TypeScript 服務(wù)是否舊緩存重啟 TS Server。如果你用了 monorepo檢查子包之間的依賴是否指向了舊構(gòu)建產(chǎn)物必要時(shí)重新 build。這類問題的根源基本不在代碼而在類型生成層沒有同步。我建議把prisma generate和類型檢查放進(jìn) CI 流程任何一步?jīng)]跑過(guò)都不允許合并。4.3 App Router 的use client邊界錯(cuò)誤使用帶來(lái)的混亂App Router 出現(xiàn)之后哪些組件能直接用 tRPC hooks成了新問題。tRPC 的 React hooks 依賴客戶端狀態(tài)React Query 的 Provider所以只能在客戶端組件里調(diào)用。但是很多新手會(huì)把整個(gè)頁(yè)面都標(biāo)成use client導(dǎo)致服務(wù)端組件完全失效首屏渲染變成瀏覽器渲染性能明顯下滑。正確做法是頁(yè)面外殼保持服務(wù)端組件只有需要交互的葉子組件按鈕、表單、列表容器單獨(dú)標(biāo)記use client。比如在 t3code 里一個(gè)典型的服務(wù)端頁(yè)面骨架// app/page.tsx服務(wù)端組件 import { PostList } from ./_components/post-list; export default function HomePage() { return ( main h1文章列表/h1 PostList / /main ); }而PostList內(nèi)部才是一個(gè)客戶端組件。這樣做的好處是頁(yè)面首屏可以靜默渲染只有列表區(qū)域在客戶端進(jìn)行交互。如果你發(fā)現(xiàn)自己把use client寫到了頁(yè)面最頂層就要停下來(lái)想想是不是所有代碼都真的需要運(yùn)行在瀏覽器上。排查思路用 React DevTools 看組件是否被正確區(qū)分為 Server/Client用構(gòu)建產(chǎn)物檢查瀏覽器 bundle 的大小如果服務(wù)端代碼被打進(jìn)去了邊界就出問題了。4.4 Zod 校驗(yàn)失敗時(shí)的模糊報(bào)錯(cuò)tRPC 的輸入校驗(yàn)依賴 Zod。當(dāng)你傳的參數(shù)不合法時(shí)報(bào)錯(cuò)信息有時(shí)會(huì)比較原始尤其是嵌套對(duì)象里的字段名錯(cuò)誤容易看得一頭霧水。我踩過(guò)的一個(gè)典型例子createPost.mutate({ title: });z.string().min(1)會(huì)拋錯(cuò)但如果你沒有配置全局錯(cuò)誤處理或者前端顯示邏輯用戶只會(huì)看到一個(gè)籠統(tǒng)的錯(cuò)誤。解決辦法是在客戶端統(tǒng)一做錯(cuò)誤映射const createPost api.post.create.useMutation({ onError: (err) { const message err.shape?.message ?? 請(qǐng)求失敗; // 在這里把 message 展示給用戶 }, });生產(chǎn)環(huán)境里我建議前端對(duì)用戶輸入先做一層 UI 校驗(yàn)比如禁用按鈕、提示必填Zod 校驗(yàn)作為后端兜底。這樣既保證用戶體驗(yàn)流暢也不會(huì)依賴后端錯(cuò)誤提示的文案質(zhì)量。5. 部署收尾連接池、邊緣函數(shù)與構(gòu)建配置最后聊聊把 t3code 從開發(fā)機(jī)推到生產(chǎn)環(huán)境時(shí)我在部署層面整理的幾條經(jīng)驗(yàn)。5.1 數(shù)據(jù)庫(kù)連接方案按部署環(huán)境區(qū)分前面已經(jīng)提到連接池的問題這里再細(xì)化一下。在生產(chǎn)環(huán)境我通常給數(shù)據(jù)庫(kù)配置兩個(gè)連接地址DATABASE_URL給應(yīng)用運(yùn)行時(shí)使用走連接池比如通過(guò)外部連接池服務(wù)或者數(shù)據(jù)庫(kù)自帶的連接池端口。DIRECT_URL給prisma migrate deploy這類遷移命令使用直連更穩(wěn)定。如果是 PostgreSQL還建議設(shè)置合理的connection_limit。在 Serverless 場(chǎng)景下單個(gè)實(shí)例的并發(fā)請(qǐng)求數(shù)通常很小connection_limit1是合理的起點(diǎn)。不要把它設(shè)得太大否則實(shí)例一多連接數(shù)會(huì)迅速膨脹。5.2 構(gòu)建階段的類型檢查不要跳過(guò)t3code 的腳手架在構(gòu)建時(shí)會(huì)默認(rèn)跑tsc --noEmit和next build。很多人嫌慢會(huì)在 CI 里把類型檢查關(guān)掉這是個(gè)典型隱患。類型安全是這個(gè)架構(gòu)的地基如果構(gòu)建階段不檢查類型等于把自動(dòng)推導(dǎo)的優(yōu)勢(shì)白白扔掉了。我的建議是本地開發(fā)npm run dev可以跳過(guò)完整類型檢查保證熱更新速度。CI/生產(chǎn)構(gòu)建必須跑npm run build它會(huì)執(zhí)行完整類型檢查。首次啟動(dòng)慢一點(diǎn)沒關(guān)系換來(lái)的是類型斷裂不會(huì)悄悄溜進(jìn)生產(chǎn)。5.3 邊緣運(yùn)行時(shí)Edge Runtime和 Node 運(yùn)行時(shí)的選擇Next.js 頁(yè)面可以配置為 Edge Runtime 或 Node.js Runtime。tRPC 和 Prisma 有一些生態(tài)兼容性差異尤其是 Prisma它依賴 Node 的部分原生能力和 Edge Runtime 的兼容性并不總是理想。我的經(jīng)驗(yàn)是如果用了 Prisma就老老實(shí)實(shí)用 Node.js Runtime。Edge Runtime 的優(yōu)勢(shì)在于全球低延遲響應(yīng)但前提是你的數(shù)據(jù)層也要跟著駐留邊緣否則請(qǐng)求最終還是得回源到數(shù)據(jù)庫(kù)所在區(qū)域優(yōu)化效果非常有限。在 t3code 里我會(huì)讓 API 路由和頁(yè)面都使用默認(rèn)的 Node.js Runtime優(yōu)先保證穩(wěn)定性和功能完整。5.4 環(huán)境變量的三個(gè)必須部署到托管平臺(tái)不管 Vercel、Netlify 還是自建 Node 服務(wù)環(huán)境變量都要單獨(dú)檢查一遍漏掉任何一個(gè)都會(huì)在運(yùn)行時(shí)出問題。我的檢查清單是DATABASE_URL和DIRECT_URL是否正確指向生產(chǎn)數(shù)據(jù)庫(kù)。NODE_ENV是否自動(dòng)設(shè)置為production大多數(shù)平臺(tái)會(huì)自動(dòng)處理。是否有任何第三方服務(wù)的密鑰、公開地址被硬編碼進(jìn)代碼里。另外有一點(diǎn)要特別提醒前端的構(gòu)建產(chǎn)物里不要包含任何服務(wù)端密鑰。Next.js 里只有以NEXT_PUBLIC_開頭的環(huán)境變量才會(huì)被打進(jìn)瀏覽器 bundle其他變量只在服務(wù)器端可見。在 t3code 里數(shù)據(jù)庫(kù)連接串永遠(yuǎn)不要以NEXT_PUBLIC_開頭否則等于把數(shù)據(jù)庫(kù)鑰匙掛在門口。最后聊幾句實(shí)際使用感受如果你現(xiàn)在正在糾結(jié)要不要仿照 t3code 的方式搭業(yè)務(wù)我的個(gè)人建議是先在一個(gè)小項(xiàng)目上試水而不要一上來(lái)就全量遷移。t3code 這套架構(gòu)的好處是類型安全和開發(fā)體驗(yàn)代價(jià)是你需要習(xí)慣所有東西都要先定義類型的思路。有些同學(xué)剛開始會(huì)覺得麻煩但跑通第一個(gè)功能后大多數(shù)人回不去手寫接口類型的日子。小技巧放最后開發(fā)時(shí)如果你發(fā)現(xiàn)編輯器卡頓或者類型提示不更新先試試重啟 TypeScript 服務(wù)如果問題還在再清node_modules/.cache。這類問題八成不是代碼錯(cuò)誤而是 TypeScript 的增量緩存和 tRPC 的復(fù)雜泛型在較老的 IDE 版本上鬧脾氣。換新版本或者升級(jí)依賴后通常就好了。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
色诱avtt| 九一亚洲国产免费| 亚洲丝袜少妇在线| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 天天干人人乐| a片亚洲一本通视频| 亚洲骚男同com| www.婷婷五月天| 亚洲91在线播放影院| 春色综合网| 日韩三级性| 国产黄色动态精品| 少妇与黑人高潮在线| 综合久久中文字幕综合日韩精品| 操日韩第| 亚洲AV噜噜狠狠网址蜜桃动漫| 精品传媒在线一区| 一级一性爱免费视频| 色偷综合| 亚洲91网站| 天天操av懂色| 成人熟女视频一区二区三区| 97国产色综合| 亚洲激情网一二三四区| 自拍盗摄一区| 亚洲国产精品久久久男人的天堂| 九久9热| 久久久一级| 操人91| 亚洲欧洲国产综合av| 亚洲国产精品有声| 天天草天天干天天日| 丰满岳乱妇一区二区三区| 粉嫩av在线| 日韩啪啪视频| 国产性刺激| 五月丁香综合激情| 99啪啪| 99精品在线观看| 日本岛国黄色网址| 亚洲AO在线| 六月丁操逼| 岛国人妻少妇av在线观看| 国产久久一区二区三区野外在线| 91无码人妻| 色情婷婷久久五月天| 中亚黄色三级大片| 精品国产乱码久久久影院| 9美女超碰在线免费观看| 99热这里都是精品| 国产91会所女技师在线观看| 亚洲国产精品有声| 人人色人人操在线| 国产精品久久久视频| 色综合一区二区三巨| 美女人妻色网站| 制服少妇欧美| 欧美激情专区| 另类小说综合网| 91人妻精华帖| 超碰人人在线| 97视频在线视频| 色女99一级片在线观看| 按摩中文字幕| 91人妻人人澡人人爽人人精品| 欧美黄页在线| JULIA一区二区三区在线播放| 国产精品爆乳懂色蜜乳| 天天色黄色影院天天操| 免费看A片毛毛片在线播| 久久98| 九九在线视频| 中文字幕片| 伊人国产av| 久久精品99久久久久久| 12一15性XXXX粉嫩国产| 亚洲天堂热| 人妻密肉在线观看| 蜜臀在线网站| 人人摸人人摸人人干| 蜜桃久久一区二区三区| 日韩电影天堂视频二区三区| 日韩无码一级黄色av片| 欧美黄片视频在线观看免费 | 国产精品69久久久久久久| 久9爱精品| 手机午夜电影神马久久| 中文字幕日韩综合| 欧美在线综合| 18禁美女裸体无遮挡啪啪| 免费观看有码高清视频| 九9精品| 欧美少妇色图| 亚洲天堂 视频你懂的| oumeizonghese,www| 亚洲欧美不卡线| 国产精品久久久久久片| 久久久男人的天堂| 国产黄片精品在线| 天天享受天天看| 丝袜AV一区二区三区| 国产家庭乱伦网址| 牛牛久久国产精品视频一二三| 亚洲天在线| 黄色电影在线播放综合网站| 日本孕妇孕交| 国产日逼视频| 男人天堂久久日韩| 欧美综合亚洲综合| 综合熟女| 欧美亚洲天堂| 91亚·色| 大香蕉乱级| 精品人妻1237| 97精品国产| 成人 日韩欧美一区| 色阁阁AV综合网| 多毛小伙内射老太婆| 国产人伦精品一区二区三区| 女人天堂av在线播放| 中文字幕五区| 欧美se综合| 91九色精品熟女内射| 91n.欧美| 久久精品99| 久久风骚城市| 91麻豆天美国产欧美| 亚洲做性| 天天流夜夜操| a'v在线资源| 97精品久久久久中文字幕| 天天色黄色影院天天操| 欧美亚洲厕所精品偷拍91| 久久久久久电影| 国产精品网站免费| 国产精品免费日韩| 91美女视频电影| 免费强奸av| 后入式999| 丁香五月激情五月| 中文乱码字字幕在线第5页| 麻豆精品久久久久久久| 国产偷拍自拍在线视频| 91爱网| 亚洲色图加勒比| 中文字幕高清精品一区| 东北操逼| 91neishe| 欧美性爱第一区| 天天草AV| 亚洲中文制服诱惑| 综合欧美激情网| 国产中文字幕在线观看| 你草精品在线视频| 综合网色| 日韩在线地址一| 天天色怡春院| 长长久久免费视频| 亚洲精品天堂久久A∨51成人漫| 国产和美国毛片| 激情五月综合网| 操国产逼| 久久国产乱子伦精品免费女,网站| 熟女中出视频| www.色五月| {男男暴菊gay无套网站| 福利五区| 男人天堂综合| 国产怡红院| 国产免费永久精品无码| 国产操操日韩三级黄| 97美日韩视频| 碰超人人在线一区二区三区| 精品久久久九九九孕妇| 丁香六月东京热| 欧美v日韩v亚洲v最新在线| 在线电影亚洲色图| 伊人991| 国产剧情一区在线观看| 日韩无码黄色片| 97久久国产精品女不卡| 国产诱惑| 深夜激情| 日本五区不卡| 狠久久| 亚洲日本天堂| 人妻在线大香蕉| 艹我哪美一区无码| 丁香激情五月| 97av在线视频| 黄片在线免费在线观看| 操逼逼福利视频| 国产精品久久久无码aV去| 亚洲资源站| 亚洲精品蜜桃久久久| 欧美色日| 久久婷婷欧美| 大香蕉欧美国产日韩高潮| 丝袜制服字幕在线| 青青草色插素人| 91日日| 天操天操夜操夜月操月年年操| 无色无码| 伊人久操| 五月天激情四射| a天堂视频| 一区三区啪啪| 岛国成人av在线播放网址| 日本一级二级三级网站| 在线人人人人人人精品超| 天天综合网日韩7799| 伊人一区二区在线播放| 台湾成人无码AV| 91影库| 淫荡少妇免费| 国产精品自产拍在线观看社区| 国产www色在线观看| 高清无码 国产精品| 伊人精品久久网站| 日韩AV无码中文一区二区| 天天干夜夜一操| 在线中文字幕极品av| 乱伦3P视频| 欧美黄片欧美黄片xxx| 婷婷亚洲五月***久久| 91精品丝袜在线观看| 曰韩av中文字幕专区| 极品尤物在线观看| 美女啊啊啊啊pc| 午夜福利区| 啊啊啊97视频| 蜜臀在线看片| 精品人妻一区二区免费蜜桃视频| 84YTCOM性无码| 成人精品久久久午夜福利| av天堂天堂av日韩| 九九综合| 人妻熟妇久草在线| 亚洲久9| 岛国免费视频在线| 亚洲黄色网址视频| 男人亚洲91首页在线| 天天综合网在线| 舔舔啊| 91熟女视频| 中文字幕一区二区三区高清| 日本三级韩三级99久久| 91丝袜在线视频| 中文字幕一区二区无码成人| 91精品微拍福利| 日韩丝袜二区| 日韩女优中文字幕| 四虎在线视频| 亚洲AV秘 精品久久老牛影视| 99久久久久久久久| 亚洲美女精品| 91热| 日韩人妻播放| 国模限制级电影| 欧美第二页午夜| 在线视频亚洲无码| 九九色图| 欧美色91| 艹比视频国产精品| 天天综合麻豆视频| 午夜精品久久久久久久久久蜜桃 | AV中文字幕剧情1区2区3| 91欧美网| 大香蕉人妻| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 天天视频黄| 丁香五月偷拍| 97色亚洲| 亚洲操操| 天天欧美| 久热91| 亚洲丝袜制服国产91_国语字幕免费观看完整版下载第5集_ | 碰人碰碰人人开房人肉| 免费精品中文字幕| 成人A片男人的天堂| 亚洲情色视频| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 激情五月天社区| 亚熟hd视频在线| 久久人妻| 综合国产97| 91欧美综合| 婷婷99| 91N综合网| 午夜免费福利视频一区| 亚洲欧美骚| 亚洲精品a人片在线观看视| 青青草色情网站视频| 国产精品视频内谢女人| 精品久久久久久久久久久久 | 欧美日本久久精品一区 | 午夜理论片在线观看免费| 国产乱人妻精品入口| 亚洲 小说 欧美 激情 另类| 中日韩久久人妻一区二区| 天天看天天日天天操| 岛国小电影| 日本久久女同性恋视频| 97露脸精品丝袜| 国产一级137片内射麻豆| 色诱avtt| 日本五十路熟女一区二区| 欧美大色交| 色婷婷九月天天综合| 九九九九97| 精品毛片久久久精品毛片| 91热色| 韩国黄色片精品久久久| 9丨久久九九九| 用力操死我| 午夜超爽| 五月天久久人妻| 伊人影院中文字幕| 91搞逼视频| 熟女熟妇伦久久影院毛片一区二区| 欧美大香蕉专区网| 午夜精品久久久久久久第一页按摩| 亚洲精品色| 日语五十路和六十路亚洲国产精品 | 夜夜春夜夜操| 人妻天天操天天爽视频免费| 家庭乱伦国产| 九九精品网| 欧美三级不卡| 久草国产在线视频| 国产在线视频午夜精华在| 极品后入免费视频| 色九月| AV和黑人在线播放| 手机在线大香蕉| 伊人991| 亚洲人妻一区二区三区| 影音先锋中文字幕日本好一区二区| 亚洲春色欧美| 大乔未久88一区| 99无码视频| heyZO天然素人无码AⅤ专区| 澳门色噜噜色噜噜色噜噜色噜噜色噜噜| 久久免费中文字幕在线观看| 亚洲一区二区性爱电影| 国产精品直播在线观看直播| 精品69网| 欧美黑人日韩少妇色情| 青青草精品| www久久久| 久草网站免费在线观看| 青娱乐999| 久9爱精品| 污污污8888| 欧美1727免费观看视频| aaaa黄片| 免费一级特黄特色大片在线观看看| 99热这里只有精品18| 91无码人妻| 欧美狠狠弄| 免费观看欧美日韩操逼视频| 亚洲综合婷婷| 中国国国产一级特黄毛片| 日韩中文字幕视频| 影音先锋日本乱伦| 亚洲欧美第一页| 精品国产a∨一区天美传媒| 一二三四视频在线社区中文字幕| 欧美色997| 麻豆天美国美国产| 99热精品在线观看| 婷婷五月天综合网| 欧亚综合一卡二卡中文字幕| 97福利视频| 天天日B夜夜干B时时操B| 国产一区二区三区免费视频在性观看 | 夜夜影视四色| 欧美人妻精品一区二区| 欧美黑人精品一区二区| 美女极品一区二区三区| 啪一啪免费视频| 国产精品亚洲天堂网址| 欧美性爱免费短视频| 91性高朝久久久久久久久| 亚洲本色精品一区二区久久| AⅤ片水多多| 国产午夜精品理论片一二三区区| 欧美日韩午夜精品一区二区三区| 国产无马在线| 久久综合亚洲色1080p| 免费观看网黄| h无码动漫在线观看| 免费簧片在线观看| 91久久久久免| 九九玖玖精品| 农村妇女精品一区二区| 茄子社区国产精品| 97精品一区二区视频在线观看| 精品免费成人久久| 亚洲无码偷拍| 韩国一级AAA| 亚洲精品中文字幕一区在线视频| 久热免费视频| 亚洲情色一区三区| 高清不卡 中文 人妻| AV中文字幕三四五| 亚洲国产精品V?在线播放| 欧亚性爱在线视频| 国产免费永久精品无码| julia在线观看久久| 青青草五月天| av橘色网站| 91久久久亚洲| 国产亚州高清国产拍精| 色呦呦、国产精品| 啊啊啊啊好大好硬啊啊啊啊啊| 国产日韩美女小穴视频网站不卡| 日韩免费簧片| 久久久国产三级黄色片| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 久久久久96| 黄骗免费网站| 黄色视频特级毛片| 日韩一区二区熟女| 亚洲蜜臀精品视频久久| 亚洲欧洲中文日韩女优乱码| 欧美操人| 国产欧洲精品亚洲午夜拍精品| 成人性交午夜免费片| 日韩激情无码影院| 青青草操逼逼视频| 综合情欲网| 日韩av性爱在线播放| 黄色高清无码无码破解免费暗网| 亚洲丝袜色图| 精品一级| 亚洲福利中文字幕在线| 天堂av2019| 91粉芽高清在线一区二区| 麻豆这里只有精品| 天天日天天屌天天操| 欧美色网络| 日韩Va亚洲va欧美Ⅴa久久| 亚洲人成网www| 无毛精品| 强奸乱伦AV网站| 激情四射婷婷四五月天| 97精品一区| 色嗨嗨在线| 精品97精品97| 富女玩鸭子一级毛片| 毛片电影一区二区三区| 亚洲欧洲激情| 精品一区二区综合熟妇| 久久神马影院| 美女天天干| 婷婷久久五月天| 国产91丝袜在线播放蜜月| 欧美特大AA级黄片| 熟女一区二区| 午夜成人爽爽爽爽A片李冰冰| 一区二区娱乐网站| 大香蕉99999| 五月婷婷久久综合| 婷婷九月丁香| 丁香六月婷婷综合| 欧美92| 大香蕉啪啪啪| 欧美精品一二三| 五月丁香影院| 校园春色综合网| 亚洲有薄码区日本系列中文字幕| 2017天天拍大香蕉| 久久国产视频专区一二三| 精品视频一区二区| 很黄很污的免费网站| yw尤物av无码点击进入麻豆| 中文字幕少妇色| 日韩欧美午夜一区二区| 激情欧美日韩女同久久| 干日本人少妇午夜寂寞影院| 精人妻无码一区二区三区伊人直播 | 无码久久国产| 男人久久精品| 午夜操逼不卡| 成年人免费观看网站| 在线强奷到舒服的无码视频| 玖玖资源视频一区二区三区| 日韩啪啪视频| 91综合色噜噜| 日日噜噜夜夜久久亚洲一区二区| 亚洲第一无码播放立川理惠| 性欧美91| 欧美 青青草| 污污汅18禁网站在线永久免费观看| 日日夜夜模| 人人操人人摸人 | 大奶啊啊好爽| 91在线超高颜值国产| 亚洲国产亚洲天堂| 欧美亚洲丝袜人妻制服99| 中文一区二区三区影院| 亚洲熟久久| 91狠狠色丁香婷婷综合久久精品| 久久久九九九| 99爱爱| 日韩高潮一区| 国产一进一出视频网站| 亚洲色图A| 久久夜夜夜| 亚洲无码色| 亚洲h片在线免费观看| 精品免费成人久久| 亚洲精品国产精品乱码不卡| 九热视频| 先锋色眉乱伦资源| 欧美懂色综合网| 天天干人妻| 国产伦精品一区二区三区视频女| 欧美人与性动交a美精品| 欧美日韩色| 久久人爽| 国产原创精品| 91|九色|国产熟女| 欧美极品性爱天天射| 啊啊啊啊啊好多水| 超碰 国产熟女精品一区| 日韩偷拍色图| 天天爱天天操| 亚洲综合精品国产一区| 久久久久亚洲av综合波多野制衣| 亚洲91在线| 97超级久久| 久久人体一区二区| 伊人991| 东京热一区二区三区四区五区六区| 欧美一级做a爰片免费视频| 亚洲视频1区| 囯产精品久久久久久久久久梁医生 | 操熟女91| 九九这里只有精品| 久久九操在线观看| 好屌色综合| 蜜臀人妻少妇久久在线观看| 久久秀这里有精品| 天无日色综合| 婷婷五月天影院| 破苞ⅩXXX性无码动漫无码| 成人性爱av| 亚洲成人黄色在线观看| 84YTCOM性无码| 91成人无码| 妇女一区二区三区| 欧美春色| 色噜噜国产精品视频一区二区| 精品国产乱码久久久影院| 干美女人妻| 欧美偷偷网| 97天天插| 黑丝制服中文字幕 | 免费人成?大片在线播放| www.91理论| 美女写真| 99ri精品| 久久久98网站免费视频| caopeng97| 亚洲精品欧美专业| 传媒免费一区二区三区| 美女丝袜激情小说| 久9综合在线| 一二三区精品视频| 国产色图乱伦| 亚洲成?V人片在线观看福利| 欧美黄色片AAAAA| 在线 制服丝袜中出 人妻| 91在线页| 国产丰满少妇久久久精品影院| av麻豆啪啪| 免看60秒涩涩视频| av中亚| 亚洲 欧美 偷拍 唯美| 亚洲暴力强奸AV| 国产欧美日韩在线不卡第一页| 五月天精品| 日本精品88888888| 国产精品久久久久久久久久二区三区| 91亚洲网站| а√天堂资源官网在线资源| 一区二区三区 日韩欧美| 激情综合五月婷婷| 日本99一区二区| AV天黑人| 国产91亚洲精品一区二区三区| 日本免费中文字幕在线| www.婷婷五月天| 免费人人搞97| 久久αⅴ| 久久九九国产精品| 成人AV素股で擦久久| 久久久精品一区二区| 欧美夜夜| 久久久久久AⅤ无码免费肉站| 久久久久成人蜜桃精品| 操91| 免费中文综合精品| 97人人干| 亚洲天堂电影网| 夜夜骑夜夜操| 看一级黄色视频| 91中文精品日韩欧美在线| 欧美97免费| 强奸乱伦AV网站| 97AV爱| 偷窥自拍亚洲| 日韩中文字幕人妻视频| 欧美日韩国第一区| 亚洲综合伊人无码久久| 美国aaaaa一级黄片| 韩国女主播青草福利视频| 欧美综合色综合| 免费自拍三级综合| yirendaxiangjiashipin| 91情色在线| 中文字幕123| 久久久久亚洲精品| 69av一区二区三区| ,国产乱人伦精品一区二区三区| 久久久久久九九九九九九| 伊人精品久久网站| 少妇与黑人高潮在线| 91九九| 99热这里只有精| 国产九九九九九九| 久久精品国产亚洲AV片多多| 色综和网| 最新av网站在线观看| 欧美日韩淫加| 黄片免费日韩| 亚洲图片欧美制度| 国产精品人妻无码久久久互動交流 | 久久久久久国产精品免费网站| 丝袜喷水在线| 黄色免费网| 久热精品色情| 亚洲?V无码专区在线电影| 亚州成人a∨| 色网站导航大全| 色老汉色| 九九精品99| 青青欧洲黑| 美女一区二区国产精品| 偷拍新久久| 丁香六月激情综合| 亚洲在线91| 亚州操操穴网| 日韩有码 一区二区三区| 熟女天天干| 美女写真| 精品十八在线观看| 精品久久青青草| 亚洲AV成人精品网站在AV| 情色av电影| 操逼国产免费| 自拍啪啪视频| 亚洲国产精品乱码在线观看| 亚洲一区在线观看欧洲 | 免费的黄片有限公司| 久久爽爽精品| 国产 日韩 另类 视频一区爱| 亚洲丝袜二区在线| 日韩女优中文字幕| 亚洲蜜乳av| 丝袜加勒比| 欧洲天天在线| 免费观看国产不卡av| 蜜臀网址在线| 夜夜高潮夜夜爽高清视频一 | 熟女熟妇伦久久影院毛片一区二区| 91精品丝袜在线观看| 欧美亚洲图片| 330dv亚洲成年视频网| 91精品丝袜在线观看| 少妇久久久久久久久| 亚洲污一污二| 色五月婷婷麻豆在| 影音先锋视频在线| 91人妻人人澡人人爽人人精品| 欧亚不卡| 啪啪啪大香蕉| 亚一综合久久久久久久久久| 亚洲成人ab| 中文字幕AV片| 人妻激情另类| 亚洲 欧美 手机在线观看| 欧美第二页| 操淫穴亚洲五月丁香| 天综合网| 国产一区二区啪啪视频| 国产精品久久久吖| 欧中美三级一区二区三区| 久久国模av| 九色 人妻 大香蕉| 五月色网| 国产无马视频| 黄色香蕉视频网站一区| 欧美的精品的视频| 成人精品水蜜桃久久久久久久| 东北女人av| 色播五月丁香| 肉嘟嘟www视频在线观看高清| 色色毛片| 欧美乱欲| 99re这里只有精品2| 精品9区| 亚洲另类色图片| 九九热精品在线| 无码国产精品久久久久| 99这里只有精品国产| 欧美超碰97| 揉揉日日日日| 91制服丝袜| 无码精品啪啪啪一区二区三区三州| 中文字日本乱码| 91人人看| 国产欧美美女免费观看视频| 九九精品热| 色综合久| 国产精品久久久久久久久AV大片| 伊人久久综合精品欧美| 亚洲精品乱码线路中文字幕| 亚洲欧洲成人在线电影| 亚洲欧美电影| 欧美v日韩v亚洲v最新在线| 蜜臀Av一区二区三区| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 少妇综合| 国产女大学生AV| 欧美狠狠干| 精品蜜乳AV免费观看| 中文乱码字字幕在线第5页| 精品人妻一区二区三区四区不卡在| 午夜啊啊| 超清中文乱码字幕| 91免费看一区二区三区| 日韩一级性爱无码| 国产日产精品久久快鸭的功能介绍| 成人一道本免费视频| 51久久夜色精品国产麻豆| 久久久亚洲Av| HEYZO高无码国产精品227| 亚洲一区二区精品福利| 日本3级一区二区免费 | 九热久| 91w欧美| 欧美极品美女aaaaaa级黄片| 欧美一级美片在线观看免费| 人人 操人人 操人人| 国产中文精品一区二区在线观看| 日本色色色视频| 色五月婷婷色| 99久久无色码| 国产精品一区二区后入| 97在线播放| 丰满人妻一区二区三区色-百度| 成人蜜乳小视频网站| 国产女人和拘做爰视频 | 少妇天堂| 高清无码久操视频| 无码WWW免费视频网站| 337p大胆噜噜噜噜噜91Av| 日韩国语字幕| 九九自拍伦理| 奶水 人妻 哺乳 在线| 在线毛片片免费观看| 搡老人老9丨女老熟人| 九九色综合| 男人的天堂欧美| 99热线麻豆| 成人26uuu| 人人操人人狠狠操| 99天天超碰| 91老妇女| 6080YYY午夜理论片在线观看| 亚洲精品a人片在线观看视| 色999人与兽| 色五月AV在线| 国产精品直播在线观看直播| 欧美一区二区观看在线| 小草三级久久观看| 啊啊啊轻点在线观看| 国产粉嫩蜜臀av一区二区三区| 国产亚洲精品av一区| 欧美|91色综合| 色偷偷超碰亚洲| 国产强奸乱伦无码视频| 亚洲成人久久美女| 精品久久久不卡一区二区| 天天综合中文字幕 91| 黑人操一区二区| 9久久9综合| 欧美九九九| 国产精品欧美日韩久久| 青娱乐亚洲热| 黄色工厂这里只有精品| 一本一道vs波多野结衣| 亚洲精品天天影视综合网| 日韩人妻无码不卡网站| 亚洲av无线观看| 99久久综合| 色婷婷国产精品一区在线观看| 五月丁香激情综合网| 中文字幕免费看| 人妻一二三区| 亚洲成人精品久久久| 男人天堂欧美| 99免费视频| 久久久啊啊啊| 无码自拍SM| 国产AV人人夜夜澡人人爽麻豆| 在线中文字幕| 蜜桃中文字日产乱幕4区| 极品肉射| 国产伦精品一区二区三区视频女| 精品十八在线观看| 亚洲AV成人无码一区二区三区在线观看 | 99在线啪| av在线观看不卡网站| 亚洲欧美另类少妇精品| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 日韩人妻精品中文字幕| 久久欲| 天天夜夜久久| 2017人人操,人人摸| 磁力99AV| 国产精品 久久久精品一牛| 青青草精品| 26uuu性物| 久久6热精品99视频| 强奸乱伦中文字幕AV| 亚洲九九视频在线观看| 亚洲女毛多水多21P| 九久久精品| 噜噜噜无码AV一级一级久久影院| 婷婷人妻激情| 一本一道人妻久久一区二区三区| 久久人妻| 亚洲免费97免费| 啪啪资源网| 欧美淫乱视频| 丝袜美腿诱惑亚洲欧美视频在线观看| 丰满人妻一区二区三区蜜桃视频| 精品人妻二区三区| 久久久久久电影| 久操| 亚洲91极品| 久久这里只精品免费福利| 啊啊啊不要好爽日韩无码一区| 综合欧美激情网| 91美女视频。| 人妻在线中出视频| 91人妻做a观看视频| 男人天堂毛片| 黄色高清久久无码依人| 欧美经典一区二区三区| 色悠悠伊人网五月天| 国产馆极品诱惑| 免费看黄视频亚洲网站| 97亚洲综合在线| 亚洲精品色| 夜嗨影院| 黄片www视频免费| 91影视亚洲| 国产欧美日韩在线观看麻豆传媒公司| 亚洲欧洲无码bt精品合集| 久久偷偷色综合蜜桃| 97人肏| 综合影视国产无码| 国产精品久久久| 91色堂| 久久9精品视频| 亚洲 欧美日韩 另类| 综合另类| 欧美丝袜亚洲| 日韩人妻精品中文字幕| 天天色粽合合合合合合合| 亚洲h片在线免费观看| 97色香蕉| 欧美高潮| 91天美传媒精品| 爽爽淫人网| 人人插人人摸人人| 精品国产一区探花在线观看| 亚洲中文字幕久久无码精品| 男人天堂久久日韩| 色色色网站| 国产精品香蕉热久久新品| 中国AAAAAA黄色片| 密臀在线视频| 中文字幕诱惑制服人妻丝袜美丝袜美 | 床上啊啊啊一区二区三区| 成人性爱视频在线看| 蜜臀无码视频在线观看| 日本亚洲嫩草影院啪啪| 亚洲精品黑丝| 白 大 人妻 区 在线| 旡码电影特区| 亚洲欧美精品一区天堂久久 | 欧美日本天堂| 日韩内射视频| 亚洲综合97中文网| 人人爱操| 精品成人av一区二区三区在线| 在线一道啪| 亚洲国产精品V?在线播放| 天天噜| 国产精品久久蜜乳av| 超碰色美女| 九九九九九九免费视频| 精品一二三区女同| 白丝少妇一区二区| 亚洲综合99999| 亚洲色图加勒比| 熟女在线视频| 欧美成人精品一区二区三区| 久久国产视频性吧| 99无码视频| 九九热精品在线| 色九九综合| 欧美九9 9 9| 欧美拳交在线播放| 香蕉在线一区二区三区| 色色色网站| 青青草视频这里只有精品| 人人乐大香蕉| 成人AV素股で擦久久| 91精品国产综合久久久蜜臀| 天天色香欲综合网| 亚洲熟妇图片| 射欧美综合| 亚州春色| 久久是精品| 在线视频资源| 澳门色噜噜色噜噜色噜噜色噜噜色噜噜| 欧美丝袜中文字幕07在线| 午夜精品久久久久久久第一页按摩| 男人天堂毛片| 亚洲丝袜诱惑| 无遮挡男女激烈动态图| 91久久免费视频互動交流| 亚欧免费| 日本高清一区二区在线| 久热大香蕉| 97人肏| 天天看特黄的免费网站| 欧美亚洲se91| 天堂av最新电影网| 97超碰中文在线| 黄片免费视频2019| 亚洲色图日韩精品| 99精彩视频| 久久色激情一区二区三区| 婷婷另类小说| 久草电影网| 中国一级αV| 久久亚洲AV无码专区首页| 日韩不卡a级视频专区| 天天干天天拍| 国产不卡中文字幕免费avi| 自拍第一页| 天天综合91| 美女一区二区国产精品| 色丁香五月婷婷| 懂色AV中文| 传媒在线观看一区二区三区| 国产偷拍网站| 人妻乱仑一区二区三区| 啊啊啊好爽快点啊啊啊嗯嗯| 日日黄色三级网站| 国产suv一区二区三区6| 亚洲一区操| 一起草av| 亚洲无限观看| 亚洲人天堂| 成年人一级黄色毛片大全在线观看| 女优视频第10页| 97网址97| 久久久久亚洲Av无码专区老牛影视| 少妇高潮特黄A片| 九九热免费国产视频婷婷伊人 | 桃花色涩综合影院| 精品一久久久| 91综合中文字幕| 日本欧美亚洲高清在线看| 91女网站| 加勒比色99999| 日韩精品一区二区日韩| 91ise欧美| 热久久无毒不卡| 午夜福利一区二区影院| 婷婷成人五月天| 日韩丨制服丨中文|在线| 国产精品福利资源在线尤物| 午夜色婷婷| 啊啊啊不要嗯嗯在线观看| av网站在线看| 婷婷五月丁香五月| 白嫩白嫩的午夜九久久久久久久久久久久成人剧场 | 内射夫妻三片| 欧美精品成人亚洲| 欧美 色 亚洲| 亚洲操人| 精品欧美日韩在线观看| 高潮毛片无遮挡高清免费| 北条麻妃99精品青青久久| 亚洲欧美91| 国产亚洲精品自在线亚洲情侣| 国产熟女二区| 99视频这有这里有精品| 亚洲国产一区二区三区在线 | 男人的天堂啪啪| 亚洲中文字幕久久无码精品| 殴美在线AⅤ| 欧美综合 站| 在线看的av| 欧美天堂超碰97| 岛国片在线视频网站| 精品无吗久久| 国产偷人伦激情在线观看| 青青国产精品在线| 亚洲毛片基地专区| 欧美拳交在线播放| 欧美性暴力| 色妹子A V| 国产精品精品系列在线观看| 91狠婷| 国产女大学生AV| 大香蕉综合| 中文字幕美女91| 色偷偷色偷偷欧美日韩| 奇米四色网| 少妇精品久久久| 日本天天操| 天操天操夜操夜月月年年操操| JIZZJIZZ国产精品喷水| 麻豆色99999| 色婷五月天| 亚洲黑人在线| 啊啊啊啊啊啊好湿好爽视频| 国产成人精品必看| 久久一本大香蕉 | 国产区在线| 78综合网| 国产精品99精品视频网站| 日本黄色裸日本黄色裸体| 台湾成人无码AV| 国产av色网| 久久一二三四五六七八九区区区 | 日本色色色| 久久久久夜夜夜夜| 91电影色诱| 午夜无码精品免费看性色| 97色欧洲| 青青操97| 成人性爱视频在线看| 欧美日韩人妻精品一区二区三区| 国产原创自拍| 午夜视频黄| 精品二区三四区五电影 | 欧美综合加勒比在线| 嗯啊抽插大香蕉网页| 自拍偷拍 高清无码| 五月婷婷激情网| 操逼啊啊啊91| 亚洲精品国产熟女久久久久久| 丰满人妻一区二区三区四区| 日韩中文字幕精品一二三事国产精品| 欧美日日夜夜| 精品久久久久9999| 久久天天躁日日躁狠狠躁| 激情小说五月天| 色欧美在线| 精品女人999| 人人操人人操人人操人人操人人操人人人11.CM | 嗯嗯啊中文字幕| 影音先锋少妇| 欧美一区二区| 9久久美女首页| 婷婷中文字幕| 成年人三级黄色片视频| 国产精品丝袜在线| 99re只有精品| 丁香九月婷婷| 约操熟妇| 成人午夜高潮av猛片| 久久9精品网站| 亚洲伊人久久精品狠狠在线| 蜜乳AV色欲AVAV无码| www.99色| 久久综合97| 综合天天。| 又摸又舔在线观看网站| 99热官网| A片 AV一级在线播放观看免费| 高清有码一区二区| 99999国产| 熟女91网| 欧美伦乱爱| 三级片大波波| 婷婷五月天影院| 欧亚性爱视频免费看| 精品国产一区二区三区在线播出| 男人天堂资源| 丝袜视频网国产90| 人妻黑丝袜电影| 久久精品天美| 人妻夜夜爽天天爽麻豆三区网站| 日本女人操逼| 国产一区二区在线电影| 日韩高清黄片| 久久久久久久强迫| …亚洲黄色厕厕女女在线播…| 天天插夜夜操| 中文字幕 码精品视频网站| 视频国产精品未满十八禁止在线观看| 亚洲国产丝袜熟女av| 九九热国产| 久久亚洲一区女同性恋中文字幕| 五月开心久久AV官网| 一区| 97大色网| 欧美三级免费伊人| 按摩中文字幕| GVH-003 母子姦 青木玲-麻豆视频,麻豆视传媒短视频网站入口,麻豆视传媒官网直 | 日日夜夜狠狠| 120分钟婬片免费看| 极品极品色影院| 国产成人无码久久精品| 图片区小说区| 日本精品成人无码| 日韩黄色电影网站| 国产欧美一区激情交| 亚洲综合色婷婷| 色婷婷99| 激情自拍 校园春色| 国产一区二区三区中文字幕| 日韩亚洲美女一区久久| 天天干2区3区| 久久偷拍人| 熟妇精品juliaannAV| 女人的天堂大香蕉网| 偷拍色图| 婷婷10月天青娱乐| 60秒不遮不挡| 视频国产欧美在线播放| 黄色免费网| 国产一级不卡在线观看| 黄色片大香蕉| 天天干天天拍| 欧美图片色综合| 欧美久久久|