Перенаправление заголовка следующего ответа Js

Цель:Чего я пытаюсь достичь: нажатием кнопки на странице запрос достигнет контроллера. Контроллер установит некоторые файлы cookie, когда ответ перенаправит страницу на другую страницу, скажем, о странице.

Вызов маршрута API напрямую из браузера: с этим кодом, когда я пытаюсь получить доступ к маршруту API непосредственно из браузера, он работает так, как ожидалось.

Когда я пытаюсь реализовать нажатием кнопки, он устанавливает файлы cookie, но не перенаправляется на страницу «О программе» и выдает мне ответ 307.

Мой API работает на том же сервере в следующем js.

Я могу реализовать это с помощью маршрутизатора, но хочу реализовать это через перенаправление заголовка ответа. Что я здесь делаю не так. Спасибо, как всегда.

      // home.tsx
'use client';
export default function Home() {
    const handleSet = () => {
        (async () => {
            await fetch('http://localhost:3000/api/test-path');
        })();
    };
    return (
        <main className="min-h-screen">
            <p>Home page</p>

            <button className="btn btn-primary" onClick={handleSet}>
                Set cookies
            </button>
        </main>
    );
}`


// route.ts   file

   `import { NextRequest, NextResponse } from 'next/server';

export async function GET(request: NextRequest) {
    const response = NextResponse.redirect(new URL('/about', new URL(request.url).origin));

    response.cookies.set({
        name: 'theme',
        value: 'dark',
        expires: new Date(2023, new Date().getMonth(), new Date().getDate(), new Date().getHours() + 3, 0, 0),
        path: '/',
        secure: true,
        httpOnly: true,
        sameSite: 'strict'
    });
    return response;
}`



1 ответ

Обработчик событий «handleSet» использует API-интерфейс выборки для выполнения запроса. API-интерфейс выборки не зависит от браузера, особенно от его документа document.location. По этой причине в браузере не будет запускаться «перенаправление». Если это желательно, это должно быть реализовано вручную.

Например:

      //[...]
await fetch(
  'http://localhost:3000/api/test-path', 
  {redirect:"manual"}
).then((response)=>{ 
  const redirectUri = response.headers.get("Location");
  //if there is a Location header, perform redirect ...
  redirectUri && document.location.href = redirectUri
});
Другие вопросы по тегам