Tutorial: Membuat aplikasi TypeScript dengan emulator Azure Cosmos DB dan menyebarkan ke Azure Cosmos DB

Dalam tutorial ini, Anda menggunakan emulator Linux Azure Cosmos DB sebagai database pengembangan lokal, membangun aplikasi TypeScript, lalu bermigrasi ke Azure Cosmos DB dengan menukar kredensial Anda.

Di tutorial ini, Anda akan:

  • Memulai emulator Azure Cosmos DB di kontainer Docker
  • Membuat aplikasi TypeScript
  • Menyambungkan aplikasi ke emulator lokal
  • Membuat akun Azure Cosmos DB
  • Menyebarkan aplikasi ke Azure Cosmos DB

Prasyarat

Mulai emulator

Gunakan gambar kontainer Docker untuk emulator Azure Cosmos DB berbasis Linux untuk membuat database pengembangan lokal.

  1. Tarik gambar kontainer emulator.

    docker pull mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview
    
  2. Mulai kontainer emulator.

    docker run --detach --publish 8081:8081 --publish 1234:1234 --name cosmos-db mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview
    
  3. Verifikasi bahwa kontainer sedang berjalan.

    docker ps --filter "name=cosmos-db"
    

    Penting

    Titik akhir gateway emulator tersedia di https://localhost:8081 dan penjelajah data tersedia di http://localhost:1234. Emulator menggunakan kunci autentikasi terkenal:

    AccountEndpoint=http://localhost:8081/;AccountKey=C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==;
    
    Setting Nilai
    Titik Akhir https://localhost:8081
    Kunci C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==

Buat aplikasi

Buat aplikasi Next.js dan sambungkan ke emulator lokal.

  1. Buat aplikasi Next.js baru di folder kosong. Terima pengaturan default apa pun.

    npx create-next-app .
    
  2. Instal pustaka klien Node.js untuk Azure Cosmos DB.

    npm install --save @azure/cosmos
    
  3. Buat file baru bernama app/data.tsx dengan kode berikut. File ini berisi tindakan server yang berinteraksi dengan database.

    "use server";
    
    import { CosmosClient } from "@azure/cosmos";
    import { revalidatePath } from "next/cache";
    
    const connectionString = "<cosmos-db-connection-string>";
    
    const client = new CosmosClient(connectionString);
    
    const { database } = await client.databases.createIfNotExists({ id: "work-management" });
    const { container } = await database.containers.createIfNotExists({ id: "tasks", partitionKey: "/id" });
    
    export type Todo = {
      id: string;
      title: string;
      completed: boolean;
    };
    
    export async function getTodos(): Promise<Todo[]> {
      const { resources } = await container.items
        .query("SELECT * FROM c ORDER BY c._ts DESC")
        .fetchAll();
      return resources.map((doc) => ({
        id: doc.id,
        title: doc.title,
        completed: doc.completed,
      }));
    }
    
    export async function addTodo(formData: FormData) {
      const title = formData.get("title") as string;
      if (!title?.trim()) return;
      await container.items.create({
        title: title.trim(),
        completed: false,
      });
      revalidatePath("/");
    }
    
    export async function toggleTodo(formData: FormData) {
      const id = formData.get("id") as string;
      const { resource: doc } = await container.item(id, id).read();
      if (doc) {
        await container.item(id, id).replace({
          ...doc,
          completed: !doc.completed,
        });
      }
      revalidatePath("/");
    }
    
    export async function deleteTodo(formData: FormData) {
      const id = formData.get("id") as string;
      await container.item(id, id).delete();
      revalidatePath("/");
    }
    

    Penting

    Ganti tempat penampung string koneksi dengan kredensial yang ditentukan sebelumnya dalam tutorial ini saat memulai kontainer.

  4. Hapus file yang app/page.tsx ada dan ganti dengan kode berikut.

    import { getTodos, addTodo, toggleTodo, deleteTodo } from "./data";
    
    export default async function Home() {
      const todos = await getTodos();
    
      return (
        <div className="min-h-screen bg-black text-zinc-50 font-sans">
          <main className="max-w-lg mx-auto py-16 px-8">
            <h1 className="text-2xl font-semibold tracking-tight mb-8">Todo App</h1>
    
            <form action={addTodo} className="flex gap-2 mb-8">
              <input
                name="title"
                placeholder="Add a todo..."
                required
                className="flex-1 rounded-md border border-zinc-700 bg-zinc-900 px-3 py-2 text-sm text-zinc-100 placeholder:text-zinc-500 focus:outline-none focus:ring-2 focus:ring-zinc-600"
              />
              <button type="submit" className="rounded-md bg-zinc-100 px-4 py-2 text-sm font-medium text-zinc-900 hover:bg-zinc-300 transition-colors">
                Add
              </button>
            </form>
    
            <ul className="space-y-2">
              {todos.map((todo) => (
                <li key={todo.id} className="flex items-center gap-3 rounded-md border border-zinc-800 bg-zinc-900 px-3 py-2">
                  <form action={toggleTodo}>
                    <input type="hidden" name="id" value={todo.id} />
                    <button type="submit" className="text-lg leading-none">{todo.completed ? "✅" : "⬜"}</button>
                  </form>
                  <span className={`flex-1 text-sm ${todo.completed ? "line-through text-zinc-500" : "text-zinc-100"}`}>{todo.title}</span>
                  <form action={deleteTodo}>
                    <input type="hidden" name="id" value={todo.id} />
                    <button type="submit" className="text-sm text-red-400 hover:text-red-300 transition-colors">✕</button>
                  </form>
                </li>
              ))}
            </ul>
    
            {todos.length === 0 && <p className="text-center text-sm text-zinc-500 mt-4">No todos yet.</p>}
          </main>
        </div>
      );
    }
    
  5. Jalankan aplikasi secara lokal.

    npm run dev
    
  6. Buka http://localhost:3000 di browser Anda untuk memverifikasi aplikasi berjalan dan terhubung ke emulator.

    Cuplikan layar aplikasi baru yang berjalan di browser web dengan beberapa item tetap ada di database.

    Petunjuk / Saran

    Anda dapat meninjau data yang dibuat aplikasi ini di Data Explorer Emulator Azure Cosmos DB di http://localhost:1234. Anda juga dapat menggunakan ekstensi Azure Cosmos DB untuk Visual Studio Code Database diberi nama work-management dan kontainer diberi nama tasks.

  7. Hentikan aplikasi.

Membuat akun Azure Cosmos DB

Buat akun Azure Cosmos DB untuk menghosting data aplikasi Anda di cloud.

  1. Buat variabel untuk nama akun dan nama grup sumber daya target.

    RESOURCE_GROUP_NAME="<resource-group-name>"
    ACCOUNT_NAME="<account-name>"
    

    Penting

    Ganti <resource-group-name> dan <account-name> dengan nilai Anda sendiri. Nama akun harus unik secara global.

  2. Buat akun Azure Cosmos DB.

    az cosmosdb create \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $ACCOUNT_NAME
    
  3. Dapatkan string koneksi untuk akun.

    az cosmosdb keys list \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $ACCOUNT_NAME \
      --type connection-strings \
      --query "connectionStrings[0].connectionString" \
      --output tsv
    
  4. Catat nilai string koneksi. Anda menggunakannya di langkah berikutnya.

Menyambungkan aplikasi ke Azure Cosmos DB

Perbarui aplikasi untuk terhubung ke Azure Cosmos DB alih-alih emulator lokal.

  1. Di app/data.tsx, ganti string koneksi emulator dengan string koneksi Azure Cosmos DB.

    const connectionString = "<azure-cosmos-db-connection-string>";
    

    Penting

    Ganti <azure-cosmos-db-connection-string> dengan string koneksi yang Anda rekam di langkah sebelumnya.

  2. Mulai aplikasi lagi.

    npm run dev
    
  3. Buka http://localhost:3000 di browser Anda. Aplikasi sekarang membaca dan menulis data ke akun Azure Cosmos DB Anda.

Membersihkan sumber daya

Ketika Anda tidak lagi memerlukan sumber daya yang dibuat dalam tutorial ini, hapus sumber daya tersebut untuk menghindari dikenakan biaya.

  1. Hapus akun Azure Cosmos DB.

    az cosmosdb delete \
      --resource-group $RESOURCE_GROUP_NAME \
      --name $ACCOUNT_NAME \
      --yes
    
  2. Hentikan dan hapus kontainer emulator.

    docker stop cosmos-db
    docker rm cosmos-db
    

Langkah selanjutnya