#How to set cookies in Next.js 13 App router API routes?

3 messages · Page 1 of 1 (latest)

raven radish
#

I have a route for registration where I want to set a cookie after writing into the database and before sending the response.

#

Here's my code for that:

import bcrypt from "bcryptjs";
import { NextResponse } from "next/server";
import { prisma } from "~/prisma/db";
import { User } from "~/providers/auth";

export type SignUpResponse = {
  user: User;
  message: string;
};

export async function POST(req: Request) {
  try {
    const { email, password } = await req.json();

    const prevUser = await prisma.user.findUnique({
      where: { email },
    });

    if (prevUser) return NextResponse.json({ message: "Email already in use" }, { status: 409 });

    const hashedPassword = await bcrypt.hash(password, 12);

    const user = await prisma.user.create({
      data: { email, password: hashedPassword },
      select: { id: true, email: true },
    });

     // 👉 set cookie over here
     // how is that done?

    return NextResponse.json({
      user,
      message: "Your account has been created!",
    } satisfies SignUpResponse);
  } catch (err) {
    if (err instanceof Error) {
      return NextResponse.json({ message: err.message }, { status: 500 });
    }
  }
}
#

I tried this:

NextResponse.next().cookies.set({ ... })

But unfortunately, this is only for middleware 😅