Tindanan Penuh Next.js 15 (Penghala Aplikasi + Tindakan Pelayan) · Pelajaran

Membina Aplikasi Fullstack

Bina sebuah projek menyeluruh dengan menggabungkan semua konsep yang telah dipelajari ke dalam aplikasi Next.js fullstack yang lengkap.

Pelajaran 2 daripada 411 langkah

Membina Aplikasi Fullstack ialah pelajaran Tindanan Penuh Next.js 15 (Penghala Aplikasi + Tindakan Pelayan) percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Tindanan Penuh Next.js 15 (Penghala Aplikasi + Tindakan Pelayan), dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Tindanan Penuh Next.js 15 (Penghala Aplikasi + Tindakan Pelayan) merangkumi sejumlah 4 pelajaran.

Aplikasi Fullstack: Pengurus Tugasan

Selamat datang ke pembinaan aplikasi fullstack dunia sebenar dengan Next.js 15! Dalam pelajaran ini, kita akan menggabungkan semua konsep yang telah Anda pelajari untuk mencipta pengurus tugasan yang ringkas.

Aplikasi kita membolehkan pengguna:

  • Log masuk dengan selamat.
  • Melihat tugasan peribadi mereka.
  • Menambah tugasan baharu.
  • Menandakan tugasan sebagai selesai.

Ini akan menunjukkan cara Server Component, Client Component, Server Action, pengambilan data dan pengesahan berfungsi bersama.

Permulaan Projek & Persediaan Pangkalan Data

Pertama sekali, mari sediakan projek kita dan takrifkan skema pangkalan data menggunakan Prisma. Kita memerlukan model untuk pengguna dan tugasan.

  • Mulakan Next.js: npx create-next-app@latest my-fullstack-app
  • Pasang Prisma: npm install prisma @prisma/client
  • Mulakan Prisma: npx prisma init --datasource-provider sqlite (atau pangkalan data pilihan Anda)

Berikut ialah schema.prisma asas untuk pengurus tugasan kita:

// 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
}

Melaksanakan NextAuth.js

Pengesahan ialah bahagian teras bagi mana-mana aplikasi fullstack. Kita akan mengintegrasikan NextAuth.js untuk mengendalikan log masuk pengguna, pendaftaran dan pengurusan sesi. Hal ini melibatkan penciptaan laluan API untuk NextAuth.

Laluan [...nextauth] kita mentakrifkan cara pengguna disahkan:

// 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 };

Memaparkan Tugasan Pengguna (RSC)

Papan pemuka utama kita akan memaparkan tugasan khusus untuk pengguna yang telah log masuk. Kita akan menggunakan React Server Component (RSC) untuk mengambil data ini terus daripada pangkalan data, sekali gus mengurangkan JavaScript pada bahagian pelanggan.

page.tsx ini mengambil tugasan dan menyerahkannya kepada Client Component untuk dipaparkan:

// 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>
  );
}

Menambah Tugasan dengan Server Action

Untuk menambah tugasan baharu, kita akan memanfaatkan Server Action Next.js. Hal ini membolehkan kita mengendalikan penghantaran borang terus pada pelayan, memastikan keselamatan dan mengesahkan semula data dalam UI kita secara automatik.

Berikut ialah Server Action ringkas untuk mencipta tugasan baharu:

// 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
}

Pengurusan Tugasan Interaktif (RCC)

Walaupun Server Component mengendalikan data awal, Client Component (RCC) penting untuk interaktiviti. Kita boleh menggunakannya untuk mengemas kini UI dengan serta-merta, seperti menandakan tugasan sebagai selesai, biasanya dengan kemas kini optimistik.

Komponen TaskList ini menggunakan keadaan pada bahagian pelanggan dan 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>
  );
}

Melindungi Laluan dengan Middleware

Untuk melindungi aplikasi kita, kita mesti melindungi laluan yang memerlukan pengesahan. Middleware Next.js amat sesuai untuk tujuan ini kerana membolehkan kita mengubah hala pengguna yang belum disahkan sebelum mereka sampai ke halaman.

middleware.ts kita boleh menguatkuasakan pengesahan untuk laluan tertentu:

// 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
};

Keadaan Pemuatan & Ralat

Aplikasi fullstack yang kukuh memberikan maklum balas yang jelas. Next.js App Router membantu dengan fail khusus untuk keadaan pemuatan dan ralat:

  • loading.js: Memaparkan UI pemuatan secara automatik untuk segmen laluan sementara kandungannya diambil pada pelayan.
  • error.js: Mewujudkan sempadan UI untuk menangkap dan memaparkan ralat dengan baik bagi segmen laluan, sekali gus menghalang keseluruhan aplikasi daripada terhenti.

Untuk Server Actions, anda juga boleh menggunakan keadaan pada pihak klien seperti isPending daripada useFormStatus untuk memaparkan penunjuk pemuatan.

Aliran Integrasi Fullstack

Mari kita gambarkan cara komponen ini berfungsi bersama dalam pengurus tugasan kita:

  • Seorang pengguna cuba mengakses /dashboard.
  • middleware.ts menyemak status pengesahan mereka melalui NextAuth.js.
  • Jika telah disahkan, dashboard/page.tsx (sebuah RSC) mengambil tugasan khusus pengguna daripada Prisma.
  • TaskList.tsx (sebuah RCC) memaparkan tugasan ini dan membolehkan status selesai ditukar secara interaktif melalui Server Action.
  • Borang berasingan (RCC) menggunakan Server Action lain untuk menambah tugasan baharu, yang kemudiannya mengesahkan semula laluan /dashboard.

Interaksi lancar ini menghasilkan pengalaman pengguna yang berkuasa dan cekap.

Semakan Integrasi Fullstack

Pertimbangkan aplikasi fullstack Next.js. Pernyataan yang manakah berikut menerangkan penggunaan lazim Server Components, Client Components, Server Actions atau Middleware dengan tepat?

Ringkasan Aplikasi Fullstack

Anda baru sahaja menelusuri proses membina aplikasi fullstack Next.js yang lengkap! Kami mengintegrasikan beberapa ciri utama:

  • Prisma ORM untuk interaksi dengan pangkalan data.
  • NextAuth.js untuk pengesahan yang selamat.
  • React Server Components untuk pengambilan data pada pihak pelayan yang cekap.
  • Next.js Server Actions untuk perubahan data dan pengesahan semula yang selamat.
  • React Client Components untuk menambahkan interaktiviti yang kaya pada pihak klien.
  • Next.js Middleware untuk melindungi laluan.

Pelajaran ini menggabungkan banyak konsep asas, lalu memberikan anda pemahaman kukuh tentang cara membina aplikasi Next.js yang kompleks dan sedia untuk produksi.

Percuma untuk bermula

Pelajari TypeScript dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
22
Pelajaran
88

Soalan Lazim

Adakah pelajaran “Membina Aplikasi Fullstack” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Tindanan Penuh Next.js 15 (Penghala Aplikasi + Tindakan Pelayan), termasuk “Membina Aplikasi Fullstack”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Tindanan Penuh Next.js 15 (Penghala Aplikasi + Tindakan Pelayan) merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Membina Aplikasi Fullstack”?

Bina sebuah projek menyeluruh dengan menggabungkan semua konsep yang telah dipelajari ke dalam aplikasi Next.js fullstack yang lengkap. Anda berlatih Tindanan Penuh Next.js 15 (Penghala Aplikasi + Tindakan Pelayan) menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Tindanan Penuh Next.js 15 (Penghala Aplikasi + Tindakan Pelayan)?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Tindanan Penuh Next.js 15 (Penghala Aplikasi + Tindakan Pelayan) di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.

Berapa lamakah pelajaran “Membina Aplikasi Fullstack” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Tindanan Penuh Next.js 15 (Penghala Aplikasi + Tindakan Pelayan) ini?

Ya. Setiap pelajaran Tindanan Penuh Next.js 15 (Penghala Aplikasi + Tindakan Pelayan) menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Pelancaran ke Vercel
  2. Membina Aplikasi Fullstack
  3. Semakan Projek & Amalan Terbaik
  4. Pemantauan dan Penjejakan Ralat dalam Produksi
← Kembali ke Tindanan Penuh Next.js 15 (Penghala Aplikasi + Tindakan Pelayan)