在NextJS v14中间件中设置请求Cookie

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

我想在页面或布局读取 cookie 之前在中间件文件中的传入请求上设置/更新 cookie,但它似乎不起作用。也许这是不可能的..

我做了一个演示项目,你可以从 github 克隆: https://github.com/TJBlackman/nextjs-middleware-set-cookies-test

// middleware.ts
import type { NextRequest } from "next/server";

export async function middleware(request: NextRequest) {
  console.log(`running middleware....`, request.method, request.url);
  request.cookies.set("x-middleware-test", "some test value?!"); // <- this line should set a cookie that can be read by layout/page??
}
// layout.tsx
import { cookies } from "next/headers";

export default function RootLayout({
  children,
}: Readonly<{
  children: React.ReactNode;
}>) {
  const cookieStore = cookies();
  const testCookie = cookieStore.get("x-middleware-test");

  return (
    <html lang="en">
      <body>
        <h1>Layout cookie: {testCookie?.value || "Not Found"}</h1>
        {children}
      </body>
    </html>
  );
}
// page.tsx
import { cookies } from "next/headers";

export default function Home() {
  const cookieStore = cookies();
  const testCookie = cookieStore.get("x-middleware-test");
  return (
    <main>
      <h2>Page cookie: {testCookie?.value || "Not Found"}</h2>
    </main>
  );
}
javascript next.js middleware nextjs14
1个回答
0
投票

问题是您应该使用

NextResponse
-
NextRequest
是只读的。

所以

import { NextResponse } from "next/server";
import type { NextRequest } from "next/server";

export function middleware(request: NextRequest) {
  console.log(`running middleware....`, request.method, request.url);

  const response = NextResponse.next();
  response.cookies.set("x-middleware-test", "some test value?!");

  return response;
}

摆脱

async
可能也是个好主意,除非您想添加
await

© www.soinside.com 2019 - 2024. All rights reserved.