如何在NextJS 13应用程序路由器中的多个路由处理程序之间共享逻辑?

wa7juj8i  于 2023-10-18  发布在  其他
关注(0)|答案(1)|浏览(106)

我正在尝试在Next.js 13应用程序中使用路由处理程序创建API。
其中一些API需要读取cookie并处理逻辑,以便在用户未登录或登录已过期时响应错误。这种逻辑在很多API中都很常见,我想在一个中心位置处理它,就像layout.js或layout.tsx可以在多个页面上共享一样。
路由处理程序中是否有功能可以执行类似于布局的角色?
官方文件中似乎没有提到这一点。有没有其他简单的方法来解决我面临的问题?
使用中间件似乎是一个可能的解决方案。然而,在“单个”中间件文件中检查所有API的所有URL并为某些API执行特定逻辑似乎不是一种干净的维护方法。

0s7z1bwu

0s7z1bwu1#

我 Package 我的路由处理程序作为nyartan评论。
src/app/API/~/route.ts

import withAuth from "@/libs/server/withAuth";

export async function POST(
  request: Request,
  { params }: { params: { id: string } }
) {
  return withAuth(request, async (request) => {

    ~~~ logic

    return new Response(
      JSON.stringify({
        ok: true,
      }),
      {
        status: 200,
      }
    );
  });
}

src/libs/server/withAuth.ts

import { Session, User } from "@prisma/client";
import getServerSession from "./getServerSession";

interface SessionWithUser extends Session {
  user: User;
}
interface RequestWithSession extends Request {
  session: SessionWithUser;
}

export default async function withAuth(
  request: Request,
  handler: (request: RequestWithSession) => Promise<Response>
) {
  const session = await getServerSession();
  if (!session) {
    return new Response(
      JSON.stringify({
        ok: false,
        error: "Not logged in",
      }),
      {
        status: 401,
      }
    );
  }

  const requestWithSession = request as RequestWithSession;
  requestWithSession.session = session;

  return handler(requestWithSession);
}

相关问题