Я работаю над проектом с аутентификацией пользователей с использованием 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, этот код работает. При наличии аутентификации выборка возвращает следующее (взятое из консоли):
У моего бэда была опечатка в моем вопросе. Папка действительно Projects, поэтому URL-адрес fetch правильный. Я обновил вопрос.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я предполагаю, что это потому, что после входа в браузер некоторые сеансы сохраняются и отправляются с вашим запросом. Однако то же самое нельзя сказать о вашем серверном компоненте.
В любом случае получение внутреннего маршрута API из серверного компонента — это плохо. Поскольку он уже запущен на сервере, извлекайте данные напрямую из вашей БД. В противном случае вы, скорее всего, получите сообщение TypeError: ошибка выборки во время сборки проекта Next.js.
Кроме того, Ли Робинсон из Vercel объясняет, что в этом видео под названием 10 распространенных ошибок при работе с маршрутизатором приложений Next.js.
Хорошо, это имеет смысл - спасибо. Передача запроса API в серверный компонент работает как положено. Я пошел по пути API, просматривая документацию NextJS здесь: nextjs.org/docs/app/building-your-application/data-fetching/…. В нем говорится, что для получения данных нужно использовать выборку на стороне сервера. Но я не осознавал, что это не лучшая практика для внутренних API.
Да, это не для внутренних API. Я очень рад @LL1997!
Это
http://localhost:3000/api/Project, а неhttp://localhost:3000/api/Projectsв твоемfetch