Bygging av en fullstack-applikasjon
Arbeid deg gjennom et omfattende prosjekt der alle lærte konsepter integreres i en komplett fullstack-Next.js-applikasjon.
Bygging av en fullstack-applikasjon er en gratis leksjon i Next.js 15 fullstack (App Router + Server Actions) på CoddyKit. Dette er leksjon 2 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Next.js 15 fullstack (App Router + Server Actions), og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Next.js 15 fullstack (App Router + Server Actions) inneholder totalt 4 leksjoner.
Fullstack-app: Oppgavebehandler
Velkommen til byggingen av en fullstack-applikasjon fra den virkelige verden med Next.js 15! I denne leksjonen integrerer vi alle konseptene du har lært, for å lage en enkel oppgavebehandler.
Appen vår lar brukere:
- Logge inn på en sikker måte.
- Se sine personlige oppgaver.
- Legge til nye oppgaver.
- Markere oppgaver som fullført.
Dette viser hvordan Server Components, Client Components, Server Actions, datainnhenting og autentisering fungerer sammen.
Initialisering av prosjekt og databaseoppsett
Først setter vi opp prosjektet og definerer databaseskjemaet ved hjelp av Prisma. Vi trenger modeller for brukere og oppgaver.
- Initialiser Next.js:
npx create-next-app@latest my-fullstack-app - Installer Prisma:
npm install prisma @prisma/client - Initialiser Prisma:
npx prisma init --datasource-provider sqlite(eller databasen du foretrekker)
Her er et grunnleggende schema.prisma for oppgavebehandleren:
// prisma/schema.prisma
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "sqlite" // or "postgresql", "mysql"
url = env("DATABASE_URL")
}
model User {
id String @id @default(cuid())
email String @unique
name String?
password String // Hashed password
tasks Task[]
}
model Task {
id String @id @default(cuid())
title String
completed Boolean @default(false)
userId String
user User @relation(fields: [userId], references: [id])
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}Implementere NextAuth.js
Autentisering er en sentral del av alle fullstack-applikasjoner. Vi integrerer NextAuth.js for å håndtere brukerinnlogging, brukerregistrering og øktstyring. Dette innebærer å opprette en API-rute for NextAuth.
Ruten [...nextauth] definerer hvordan brukere autentiseres:
// app/api/auth/[...nextauth]/route.ts
import NextAuth from "next-auth";
import CredentialsProvider from "next-auth/providers/credentials";
import { PrismaAdapter } from "@auth/prisma-adapter";
import { PrismaClient } from "@prisma/client";
import bcrypt from "bcrypt";
const prisma = new PrismaClient();
const handler = NextAuth({
adapter: PrismaAdapter(prisma),
providers: [
CredentialsProvider({
name: "Credentials",
credentials: {
email: { label: "Email", type: "text" },
password: { label: "Password", type: "password" }
},
async authorize(credentials) {
if (!credentials?.email || !credentials?.password) return null;
const user = await prisma.user.findUnique({
where: { email: credentials.email }
});
if (!user || !(await bcrypt.compare(credentials.password, user.password))) {
return null;
}
return { id: user.id, email: user.email, name: user.name };
},
}),
],
session: { strategy: "jwt" },
callbacks: {
jwt: async ({ token, user }) => {
if (user) {
token.id = user.id;
token.email = user.email;
}
return token;
},
session: async ({ session, token }) => {
if (token) {
session.user.id = token.id as string;
session.user.email = token.email;
}
return session;
},
},
pages: {
signIn: "/auth/signin",
},
});
export { handler as GET, handler as POST };Vise brukerens oppgaver (RSC)
Hoveddashbordet vårt viser oppgaver som tilhører den innloggede brukeren. Vi bruker en React Server Component (RSC) til å hente disse dataene direkte fra databasen, noe som reduserer mengden JavaScript på klientsiden.
Denne page.tsx-filen henter oppgaver og sender dem til en Client Component for gjengivelse:
// app/dashboard/page.tsx
import { getServerSession } from "next-auth";
import { authOptions } from "@/app/api/auth/[...nextauth]/route"; // Adjust path
import { PrismaClient } from "@prisma/client";
import TaskList from "./TaskList"; // This will be a Client Component
const prisma = new PrismaClient();
export default async function DashboardPage() {
const session = await getServerSession(authOptions);
if (!session || !session.user?.id) {
return <p>Please sign in to view your tasks.</p>;
}
const tasks = await prisma.task.findMany({
where: { userId: session.user.id },
orderBy: { createdAt: "desc" },
});
return (
<div>
<h1>Welcome, {session.user.name || session.user.email}!</h1>
<h2>Your Tasks</h2>
<TaskList initialTasks={tasks} />
</div>
);
}Legge til oppgaver med Server Actions
For å legge til nye oppgaver bruker vi Next.js Server Actions. Dette lar oss håndtere innsending av skjemaer direkte på serveren, noe som ivaretar sikkerheten og automatisk validerer dataene på nytt i brukergrensesnittet.
Her er en forenklet Server Action som oppretter en ny oppgave:
// app/actions/task-actions.ts
"use server";
import { revalidatePath } from "next/cache";
import { getServerSession } from "next-auth";
import { authOptions } from "@/app/api/auth/[...nextauth]/route";
import { PrismaClient } from "@prisma/client";
const prisma = new PrismaClient();
export async function addTask(formData: FormData) {
const session = await getServerSession(authOptions);
if (!session || !session.user?.id) {
throw new Error("Unauthorized");
}
const title = formData.get("title") as string;
if (!title || title.trim() === "") {
throw new Error("Task title cannot be empty.");
}
await prisma.task.create({
data: {
title,
userId: session.user.id,
},
});
revalidatePath("/dashboard"); // Revalidate dashboard to show new task
}Interaktiv oppgavebehandling (RCC)
Mens Server Components håndterer de innledende dataene, er Client Components (RCC) avgjørende for interaktivitet. Vi kan bruke dem til å oppdatere brukergrensesnittet umiddelbart, for eksempel når en oppgave markeres som fullført, ofte med optimistiske oppdateringer.
Denne TaskList-komponenten bruker tilstand på klientsiden og en Server Action:
// app/dashboard/TaskList.tsx (Client Component)
"use client";
import { useState } from "react";
// Assume toggleTaskCompletion is another server action
import { toggleTaskCompletion } from "@/app/actions/task-actions";
export default function TaskList({ initialTasks }) {
const [tasks, setTasks] = useState(initialTasks);
const handleToggle = async (taskId: string, currentStatus: boolean) => {
// Optimistic UI update
setTasks(tasks.map(task =>
task.id === taskId ? { ...task, completed: !currentStatus } : task
));
try {
await toggleTaskCompletion(taskId, !currentStatus);
} catch (error) {
console.error("Failed to toggle task:", error);
// Revert if error
setTasks(initialTasks); // Revert to initial state on error
}
};
return (
<ul>
{tasks.map(task => (
<li key={task.id}>
<input
type="checkbox"
checked={task.completed}
onChange={() => handleToggle(task.id, task.completed)}
/>
<span style={{ textDecoration: task.completed ? "line-through" : "none" }}>
{task.title}
</span>
</li>
))}
</ul>
);
}Beskytte ruter med Middleware
For å sikre applikasjonen må vi beskytte ruter som krever autentisering. Next.js Middleware passer godt til dette, fordi den kan omdirigere uautentiserte brukere før de i det hele tatt når frem til en side.
Med middleware.ts kan vi håndheve autentisering for bestemte stier:
// middleware.ts
import { withAuth } from "next-auth/middleware";
import { NextResponse } from "next/server";
export default withAuth(
// `withAuth` augments the Next.js request with the user's token.
function middleware(req) {
const { pathname } = req.nextUrl;
// Example: Only allow authenticated users to access /dashboard
if (pathname.startsWith("/dashboard") && !req.nextauth.token) {
return NextResponse.redirect(new URL("/auth/signin", req.url));
}
// Allow access to public pages or authenticated pages
return NextResponse.next();
},
{
callbacks: {
authorized: ({ token }) => !!token, // Only allow if token exists
},
pages: {
signIn: "/auth/signin",
},
}
);
export const config = {
matcher: ["/dashboard/:path*", "/api/protected/:path*"], // Apply middleware to these paths
};Tilstander for lasting og feil
En robust fullstack-app gir tydelige tilbakemeldinger. Next.js App Router gjør det enklere med egne filer for laste- og feiltilstander:
loading.js: Viser automatisk et laste-UI for et rutesegment mens innholdet hentes fra serveren.error.js: Oppretter UI-grenser som fanger opp og viser feil på en kontrollert måte for et rutesegment, slik at hele appen ikke krasjer.
For Server Actions kan De også bruke tilstander på klientsiden, for eksempel isPending fra useFormStatus, til å vise lasteindikatorer.
Fullstack-integrasjonsflyten
La oss se for oss hvordan disse komponentene fungerer sammen i oppgavebehandleren vår:
- En bruker prøver å få tilgang til
/dashboard. middleware.tskontrollerer autentiseringsstatusen deres via NextAuth.js.- Hvis brukeren er autentisert, henter
dashboard/page.tsx(en RSC) brukerspesifikke oppgaver fra Prisma. TaskList.tsx(en RCC) gjengir disse oppgavene og lar brukeren endre fullføringsstatus interaktivt via en Server Action.- Et separat skjema (RCC) bruker en annen Server Action til å legge til nye oppgaver, og validerer deretter
/dashboard-banen på nytt.
Denne sømløse samhandlingen gir en kraftig og effektiv brukeropplevelse.
Kontroll av fullstack-integrasjon
Se for Dem en fullstack-applikasjon i Next.js. Hvilke av følgende påstander beskriver riktig den typiske bruken av Server Components, Client Components, Server Actions eller Middleware?
Oppsummering av fullstack-appen
De har nettopp gått gjennom prosessen med å bygge en omfattende fullstack-applikasjon i Next.js! Vi integrerte flere viktige funksjoner:
- Prisma ORM for samhandling med databasen.
- NextAuth.js for sikker autentisering.
- React Server Components for effektiv henting av data på serversiden.
- Next.js Server Actions for sikre dataendringer og ny validering.
- React Client Components for avansert interaktivitet på klientsiden.
- Next.js Middleware for å beskytte ruter.
Denne leksjonen knytter sammen mange grunnleggende konsepter og gir Dem en solid forståelse av hvordan De bygger komplekse, produksjonsklare Next.js-applikasjoner.
Lær deg TypeScript med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 22
- Leksjoner
- 88
Ofte stilte spørsmål
Er leksjonen «Bygging av en fullstack-applikasjon» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Next.js 15 fullstack (App Router + Server Actions), inkludert «Bygging av en fullstack-applikasjon», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Next.js 15 fullstack (App Router + Server Actions) inneholder totalt 4 leksjoner.
Hva lærer jeg i «Bygging av en fullstack-applikasjon»?
Arbeid deg gjennom et omfattende prosjekt der alle lærte konsepter integreres i en komplett fullstack-Next.js-applikasjon. Du øver på Next.js 15 fullstack (App Router + Server Actions) med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Next.js 15 fullstack (App Router + Server Actions)?
Ingen tidligere erfaring er nødvendig. Next.js 15 fullstack (App Router + Server Actions) på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.
Hvor lang tid tar leksjonen «Bygging av en fullstack-applikasjon»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Next.js 15 fullstack (App Router + Server Actions)-leksjonen?
Ja. Alle Next.js 15 fullstack (App Router + Server Actions)-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Distribusjon til Vercel
- Bygging av en fullstack-applikasjon
- Gjennomgang av prosjektet og beste praksis
- Overvåking og feilesporing i produksjon