Menu
Coddy logo textTech

Что такое Server Action

Часть раздела Основы Next.js путешествия по React на Coddy — урок 29 из 47.

Теперь вы можете читать данные на сервере. Пришло время для второй половины: их изменения.

До недавнего времени сохранение одной строки текста требовало удивительно много условностей. Вы писали эндпоинт:

// app/api/items/route.js
export async function POST(request) {
    const body = await request.json();
    saveItem(body.text);
    return Response.json({ ok: true });
}

…затем вызвали его из браузера:

await fetch('/api/items', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ text }),
});

Два файла, URL, method, headers и JSON в обоих направлениях, чтобы переместить одну строку из form в базу данных.

Server Action удаляет всё это. Напишите асинхронную функцию в файле, первая строка которого — 'use server':

// app/actions.js
'use server';

import { saveItem } from '../lib/db';

export async function addItem(formData) {
    saveItem(formData.get('text'));
}

…и передать эту функцию в форму:

<form action={addItem}>
    <input name="text" />
    <button type="submit">Add</button>
</form>

Вот и всё. Стоит отметить три детали:

  • 'use server' должна быть первой строкой файла: такой же маркер, как и 'use client', только указывающий в другую сторону. Он говорит: всё, что экспортируется отсюда, выполняется на сервере.
  • Тело функции никогда не попадает в браузер. Ваши учётные данные базы данных находятся в безопасности внутри него: браузер получает только ссылку, которую он может вызвать.
  • Вы не написали ни одного URL. Next.js создаёт эндпоинт за вас; action={addItem} — это вся обвязка.

Одно из отличий от основ: эти поля ввода формы являются неконтролируемыми. Никаких useState, value и onChange: браузер сам хранит текст, а атрибут name — это то, как action находит его при отправке (submit).

Попробуйте сами

В этом уроке нет задания по программированию.

quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы Next.js