Bird
Raised Fist0
NextJSframework~5 mins

Form actions with server functions in NextJS

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction

Form actions with server functions let you handle form data directly on the server. This makes your app faster and more secure by avoiding extra client-side code.

When you want to submit a form and save data to a database securely.
When you need to process user input without exposing logic to the browser.
When you want to keep your React components simple and handle form logic on the server.
When you want to avoid client-side JavaScript for form submission.
When you want to use Next.js App Router features for server-side form handling.
Syntax
NextJS
import { redirect } from 'next/navigation'

export async function action(formData: FormData) {
  // process formData here
  return redirect('/thank-you')
}

export default function Page() {
  return (
    <form action={action} method="post">
      <input name="name" type="text" required />
      <button type="submit">Send</button>
    </form>
  )
}

The action function runs on the server when the form is submitted.

Use formData.get('fieldName') to access form values inside the action.

Examples
This example logs the submitted name on the server and returns a simple response.
NextJS
export async function action(formData: FormData) {
  const name = formData.get('name')
  console.log('Name:', name)
  return new Response('Form received')
}

export default function Page() {
  return (
    <form action={action} method="post">
      <input name="name" type="text" />
      <button type="submit">Submit</button>
    </form>
  )
}
This example redirects the user after saving the email.
NextJS
import { redirect } from 'next/navigation'

export async function action(formData: FormData) {
  const email = formData.get('email')
  // Save email to database here
  return redirect('/welcome')
}

export default function Page() {
  return (
    <form action={action} method="post">
      <input name="email" type="email" required />
      <button type="submit">Register</button>
    </form>
  )
}
Sample Program

This is a simple contact form. When submitted, the message is sent to the server function action. The server logs the message and then redirects the user to a thank-you page.

NextJS
import { redirect } from 'next/navigation'

export async function action(formData: FormData) {
  const message = formData.get('message')
  console.log('Received message:', message)
  // Here you could save the message to a database
  return redirect('/thank-you')
}

export default function ContactForm() {
  return (
    <main>
      <h1>Contact Us</h1>
      <form action={action} method="post">
        <label htmlFor="message">Your Message:</label>
        <textarea id="message" name="message" required rows={4} cols={40}></textarea>
        <button type="submit">Send</button>
      </form>
    </main>
  )
}
OutputSuccess
Important Notes

Server functions run only on the server, so you cannot use browser APIs inside them.

Use redirect() from next/navigation to send users to another page after form submission.

Always add method="post" to your form to send data securely.

Summary

Form actions let you handle form data on the server in Next.js App Router.

Use action functions to process form data and respond or redirect.

This approach keeps your app secure and simple by avoiding client-side form logic.

Practice

(1/5)
1. What is the main purpose of using form actions with server functions in Next.js App Router?
easy
A. To fetch data from an external API on the client
B. To run client-side validation before submitting the form
C. To style the form elements dynamically
D. To handle form submissions securely on the server without client-side JavaScript

Solution

  1. Step 1: Understand form actions role

    Form actions in Next.js let you handle form data processing on the server side, improving security and simplicity.
  2. Step 2: Compare with client-side logic

    Unlike client-side validation or styling, form actions avoid running JavaScript in the browser for form handling.
  3. Final Answer:

    To handle form submissions securely on the server without client-side JavaScript -> Option D
  4. Quick Check:

    Form actions = server-side handling [OK]
Hint: Form actions run on server, not client [OK]
Common Mistakes:
  • Thinking form actions run client-side
  • Confusing form styling with form handling
  • Assuming form actions fetch external APIs on client
2. Which of the following is the correct way to define a server action function for a form in Next.js?
easy
A. export async function action(formData) { /* handle data */ }
B. function action() { return }
C. const action = () => console.log('submit')
D. export default function action() { alert('submitted') }

Solution

  1. Step 1: Identify server action syntax

    Server actions are async functions exported to handle form data, receiving formData as parameter.
  2. Step 2: Check other options

    Other options either return JSX incorrectly or use client-side code like alert or console.log without async/await.
  3. Final Answer:

    export async function action(formData) { /* handle data */ } -> Option A
  4. Quick Check:

    Server action = async export function [OK]
Hint: Server actions are async exported functions with formData param [OK]
Common Mistakes:
  • Defining action as a React component
  • Using alert or console.log inside server action
  • Not marking function as async
3. Given this server action function in Next.js, what will be the output after submitting the form?
export async function action(formData) {
  const name = formData.get('name');
  return new Response(`Hello, ${name}!`);
}
medium
A. The page will reload without any message
B. The form data is ignored and no response is sent
C. The server responds with 'Hello, [name]!' where [name] is the input value
D. A syntax error occurs because Response is not allowed

Solution

  1. Step 1: Extract form data value

    The function uses formData.get('name') to get the input named 'name'.
  2. Step 2: Return a Response with greeting

    The function returns a Response object with a greeting message including the name value.
  3. Final Answer:

    The server responds with 'Hello, [name]!' where [name] is the input value -> Option C
  4. Quick Check:

    formData.get + Response = greeting message [OK]
Hint: formData.get returns input value used in Response [OK]
Common Mistakes:
  • Assuming Response is invalid in server action
  • Thinking form data is ignored
  • Expecting page reload without message
4. Identify the error in this Next.js server action function:
export async function action(formData) {
  const email = formData.email;
  return new Response(`Email: ${email}`);
}
medium
A. Response object cannot be returned from server actions
B. Using formData.email instead of formData.get('email')
C. Missing async keyword in function declaration
D. Function should not be exported

Solution

  1. Step 1: Check how formData is accessed

    formData is a FormData object; to get values, use formData.get('fieldName'), not dot notation.
  2. Step 2: Validate other parts

    The function is async and exported correctly; returning Response is allowed in server actions.
  3. Final Answer:

    Using formData.email instead of formData.get('email') -> Option B
  4. Quick Check:

    Access formData with get() method [OK]
Hint: Use formData.get('field') to access form values [OK]
Common Mistakes:
  • Accessing formData fields with dot notation
  • Forgetting async keyword
  • Thinking Response cannot be returned
5. You want to create a Next.js form that submits user feedback and then redirects to a thank-you page using a server action. Which code snippet correctly implements this behavior?
export async function action(formData) {
  const feedback = formData.get('feedback');
  // Save feedback to database (omitted)
  return redirect('/thank-you');
}
hard
A. This code correctly handles form data and redirects after submission
B. You cannot use redirect in server actions; must return JSON instead
C. The formData.get call should be replaced with formData.feedback
D. Server actions cannot perform side effects like saving data

Solution

  1. Step 1: Verify form data retrieval

    The code correctly uses formData.get('feedback') to get the input value.
  2. Step 2: Confirm redirect usage

    Next.js server actions support returning redirect() to navigate after processing.
  3. Final Answer:

    This code correctly handles form data and redirects after submission -> Option A
  4. Quick Check:

    formData.get + redirect() = correct pattern [OK]
Hint: Use redirect() in server action to navigate after submit [OK]
Common Mistakes:
  • Thinking redirect() is not allowed in server actions
  • Accessing formData with dot notation
  • Believing server actions cannot save data or cause side effects