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

问题描述 投票:0回答:1

我正在尝试在 Next.js 13 应用程序中使用路由处理程序创建 API。

其中一些 API 需要读取 cookie 并处理逻辑,以便在用户未登录或登录已过期时响应错误。这一逻辑对于许多 API 来说都很常见,我希望在一个中心位置处理它,类似于如何在多个页面之间共享layout.js 或layout.tsx。

路由处理程序中是否有一个功能可以执行类似于布局的角色?

官方文档中似乎没有提到这一点。 还有另一种干净的方法来解决我面临的问题吗?

使用中间件似乎是一个可能的解决方案。 然而,检查“单个”中间件文件中所有 API 的所有 URL 并为某些 API 执行特定逻辑似乎并不是一种干净的维护方法。

next.js middleware next.js13 app-router
1个回答
0
投票

我按照 nyrthan 的评论包装了我的路线处理程序。

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.