Next.JS с auth.js, защищающим маршруты API, fetch() не работает

Я работаю над проектом с аутентификацией пользователей с использованием auth.js в next.js. Я хочу иметь API, который будет получать конкретную информацию о пользователе из базы данных MongoDB. Сайт защищен с помощью промежуточного программного обеспечения в next.js. Мой API работает, если я напрямую обращаюсь к URL-адресу после входа в систему (localhost: 3000/api/Project). Однако когда я пытаюсь получить данные, я получаю сообщение об ошибке Error: Unexpected token '<', "<!DOCTYPE "... is not valid JSON, поэтому кажется, что где-то есть перенаправление, но я не могу понять, почему.
Это мой api/Projects/route.js

import { connectDB } from "../../../utils/database";
import { NextResponse } from "next/server";
import Project from "../../(models)/Project";
import { getServerSession } from "next-auth";
import { options } from "../../api/auth/[...nextauth]/options";

export const GET = async (req, res) => {
  const session = await getServerSession(options);

  try {
    await connectDB();
    const fetchedProjects = await Project.find({
      userID: session.user.id,
    }).exec();

    return new NextResponse(JSON.stringify(fetchedProjects), { status: 200 });
  } catch (error) {
    return new NextResponse("Error in fetching data" + error, { status: 500 });
  }
};

Это выборка API в моем app/projects/page.js

async function getProjects() {
  try {
    console.info("FETCHING DOCUMENTS");
    const res = await fetch("http://localhost:3000/api/Projects", {
      cache: "no-store",
    });
    if (!res.ok) return notFound();
    console.info(res);
    return res.json();
  } catch (error) {
    console.info(error);
  }
};

Если я обхожу всю свою аутентификацию и просто получаю все записи из базы данных в своем API, этот код работает. При наличии аутентификации выборка возвращает следующее (взятое из консоли):

Это http://localhost:3000/api/Project, а не http://localhost:3000/api/Projects в твоем fetch

Youssouf Oumar 23.02.2024 17:33

У моего бэда была опечатка в моем вопросе. Папка действительно Projects, поэтому URL-адрес fetch правильный. Я обновил вопрос.

LL1997 24.02.2024 08:06
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
2
886
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

В любом случае получение внутреннего маршрута API из серверного компонента — это плохо. Поскольку он уже запущен на сервере, извлекайте данные напрямую из вашей БД. В противном случае вы, скорее всего, получите сообщение TypeError: ошибка выборки во время сборки проекта Next.js.

Кроме того, Ли Робинсон из Vercel объясняет, что в этом видео под названием 10 распространенных ошибок при работе с маршрутизатором приложений Next.js.

Хорошо, это имеет смысл - спасибо. Передача запроса API в серверный компонент работает как положено. Я пошел по пути API, просматривая документацию NextJS здесь: nextjs.org/docs/app/building-your-application/data-fetching/‌​…. В нем говорится, что для получения данных нужно использовать выборку на стороне сервера. Но я не осознавал, что это не лучшая практика для внутренних API.

LL1997 24.02.2024 09:51

Да, это не для внутренних API. Я очень рад @LL1997!

Youssouf Oumar 24.02.2024 09:55

Другие вопросы по теме

Похожие вопросы

NextJS добавляет теги комментариев вокруг динамического заголовка страницы
Компоненты не отображаются, но URL-адрес меняется после обновления до React-Router-DOM v6
Программно добавлять рекламные паузы на YouTube к собственному видео с помощью скрипта (в JS)
Вогнутая форма Three.js из облака точек
Невозможно найти раздел визуальных эффектов на вкладке форматирования при создании пользовательского визуального элемента Forge(aps)
Отображение оповещения только при закрытии вкладки браузера, а не при обновлении страницы
React Redux «Внутри отправки обнаружена мутация состояния» Ошибка
Компонент React по-прежнему отображается, хотя он должен был быть скрыт настройкой
Состояние воспроизведения анимации не может приостановить анимацию CSS, когда пользователи переключаются между вкладками
Реагировать на отсутствие рендеринга при первоначальном рендеринге фильтра массива объектов