typescript - NextJS - API-route returnerer altid statuskode 200
Ret ny til Next.js, og jeg er stødt på et problem, når jeg prøver at hente en API. Selve API'en er ret enkel og tjekker, om der er en session (brugeren er logget ind), og returnerer derefter en JSON med en GET. Dette er getGoal/route.ts API-filen:
import { getAuthSession } from "@/lib/auth";
import { db } from "@/lib/db";
export async function GET(req: Request) {
try {
// Get the user session using NextAuth.js getAuthSession function
const session = await getAuthSession();
if (!session?.user) {
// User is not logged in, return an error response
return new Response("User is not logged in", {
status: 401, // Unauthorized
});
}
// Retrieve user ID from the session object
const userId = session.user.id;
// Fetch goals associated with the user ID
const goals = await db.goal.findMany({
where: {
userId: userId,
},
});
return new Response(JSON.stringify(goals), {
status: 200,
});
} catch (error) {
// Handle any other errors that occur during the request
console.error(error);
return new Response("Internal Server Error", {
status: 500,
});
}
}
Hvis jeg tilgår denne kode i min browser http://localhost:3000/api/getGoal, returnerer den 401-beskeden med Brugeren er ikke logget ind, hvis jeg ikke er logget ind, og den returnerer JSON'en, hvis jeg er logget ind. Men hvis jeg derefter prøver at hente dette API i min page.tsx:
import ProgressBar from '@/components/ProgressBar';
async function getData() {
const data = await fetch('http://localhost:3000/api/goal')
console.log(data.status)
if (data.status !== 200) {
throw new Error(data.statusText)
}
return data.json()
}
export default async function Home(){
const goals = await getData()
return (
<div className='flex justify-center items-center'>
<ProgressBar goals={goals} />
</div>
);
};
Og hvis jeg console.log data.status, returnerer det altid en statuskode på 200 og viser altid dataene. Jeg tror, jeg mangler noget her, men jeg kan bare ikke forstå det. Igen, jeg er ret ny til Nextjs og React generelt.
Jeg har prøvet forskellige typer af catch-sætninger. Jeg har prøvet at spørge chatgpt. Jeg har prøvet at lede efter tutorials. Jeg forventer, at det kun viser dataene, hvis en bruger er logget ind (der er en session).
Svar #1
Du kan bruge NextResponse som nævnt i Nextjs-dokumentationen.
import { NextResponse } from "next/server";
export async function GET(req: Request) {
try {
// ... you code
const goals = {};
return NextResponse.json(goals, {
status: 200,
});
} catch (error) {
// Handle any other errors that occur during the request
console.error(error);
return NextResponse.json({"error": "Internal Server Error"}, {
status: 500,
});
}
}
