在Next中间件中调用tRPC过程

9lowa7mx  于 2023-06-05  发布在  其他
关注(0)|答案(1)|浏览(268)

我想在我的中间件中调用我的tRPC过程来重定向那些已经授权但还没有注册的用户(在我的数据库中)。现在我显然不能在这里使用useQuery,因为它不是一个react组件,但我也不能只编写一个API路由,我可以调用并传递prisma,因为中间件位于前端和后端。出于明显的安全原因,您不能在前端使用Prisma客户端。所以我有点卡住了,我相信这将是一个简单的一行从这里的人!

import { getAuth, withClerkMiddleware } from "@clerk/nextjs/server";
import { type NextRequest, NextResponse } from "next/server";
import { api } from "./utils/api";
import { appRouter } from "./server/api/root";
import { prisma } from "./server/db";

export default withClerkMiddleware(async (req: NextRequest, opts) => {
 const { userId } = getAuth(req);

 if (userId) {
// Fetch user data from your TRPC client (Replace this with your actual API call)

const user = api.ptusers.getOne({id: userId}).useQuery()

// If user doesn't exist in your database, redirect to sign up page
if (!user) {
  return NextResponse.redirect("/sign-up");
  }
 }

return NextResponse.next();
});

// Stop Middleware running on static files
export const config = {
matcher: "/((?!_next/image|_next/static|favicon.ico|bg-signup.jpg).*)",
};
vulvrdjw

vulvrdjw1#

你可以使用createTRPCProxyClient来做客户端调用而不使用钩子,检查docs来学习如何设置客户端。
您也可以使用caller API,caller api docs直接从服务器调用您的过程。
我不确定,但用query替换userQuery可能会完成工作,或者请尝试上述任何解决方案。

const user = api.ptusers.getOne({id: userId}).query()

不要担心从中间件函数进行服务器端调用,它不会包含在您的包中,而是在远离客户端的地方执行。

相关问题