我正在尝试在 Next.js 13 应用程序中使用路由处理程序创建 API。
其中一些 API 需要读取 cookie 并处理逻辑,以便在用户未登录或登录已过期时响应错误。这一逻辑对于许多 API 来说都很常见,我希望在一个中心位置处理它,类似于如何在多个页面之间共享layout.js 或layout.tsx。
路由处理程序中是否有一个功能可以执行类似于布局的角色?
官方文档中似乎没有提到这一点。 还有另一种干净的方法来解决我面临的问题吗?
使用中间件似乎是一个可能的解决方案。 然而,检查“单个”中间件文件中所有 API 的所有 URL 并为某些 API 执行特定逻辑似乎并不是一种干净的维护方法。
我按照 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);
}