Docs
API Calls

API Calls

Let's take a look at how to use api call.

You can find all your serverless API requests in /app/api. You can use await fetch or axios to make HTTP requests. For an example, you can check out /libs/api.ts, where Axios is used to create an HTTP request wrapper.

Regular api call

Here is an example public API endpoint for send email:

export async function POST(req) {
  try {
    // Extract the data from the request body
    const { to, title, content, from, head } = await req.json()
 
    // Configure the transporter
    const transporter = nodemailer.createTransport({
      host: "smtp.exmail.qq.com",
      port: 465,
      secure: true, // true for 465, false for other ports
      auth: {
        user: "[email protected]",
        pass: "xxx",
      },
      tls: {
        rejectUnauthorized: false, // 在某些环境下,设置为 false 可以避免认证问题
      },
    })
 
    // Define the email options
    const mailOptions = {
      from: `"${head}" <${from}>`,
      to,
      subject: title,
      html: content, // HTML content of the email
    }
 
    // Send the email
    await transporter.sendMail(mailOptions)
 
    // Return a success response
    return NextResponse.json(
      { message: "Email sent successfully" },
      { status: 200 }
    )
  } catch (error) {
    console.error("Error sending email:", error)
    return NextResponse.json(
      { message: "Failed to send email", error: error.toString() },
      { status: 500 }
    )
  }
}
 

Protected api call

  • Here, you can use sessions to handle authentication checks and manage scenarios like redirecting to the login page.
export default async function DashboardPage() {
  const user = await getCurrentUser()
 
  if (!user) {
    redirect(authOptions?.pages?.signIn || "/login")
  }
 
  const posts = await db.post.findMany({
    where: {
      authorId: user.id,
      deleted: false,
    },
    select: {
      id: true,
      title: true,
      published: true,
      createdAt: true,
    },
    orderBy: {
      updatedAt: "desc",
    },
  })
 
  return (
    <DashboardShell>
      <DashboardHeader heading="Posts" text="Create and manage posts.">
        <PostCreateButton />
      </DashboardHeader>
      <div>
        {posts?.length ? (
          <div className="divide-y divide-border rounded-md border">
            {posts.map((post) => (
              <PostItem key={post.id} post={post} />
            ))}
          </div>
        ) : (
          <EmptyPlaceholder>
            <EmptyPlaceholder.Icon name="post" />
            <EmptyPlaceholder.Title>No posts created</EmptyPlaceholder.Title>
            <EmptyPlaceholder.Description>
              You don&apos;t have any posts yet. Start creating content.
            </EmptyPlaceholder.Description>
            <PostCreateButton variant="outline" />
          </EmptyPlaceholder>
        )}
      </div>
    </DashboardShell>
  )
}
 

db call

Here are some examples of CRUD operations, and you can also find many working examples in /app/api/:

  • Create user
 
async function createUser() {
  const newUser = await db.user.create({
    data: {
      email: "[email protected]",
      name: "Test User",
      credits: 10, // 初始化积分
    },
  });
 
  console.log("User Created:", newUser);
  return newUser;
}
 
  • Query user
async function getUserByEmail(email: string) {
  const user = await db.user.findUnique({
    where: {
      email,
    },
  });
 
  console.log("User Found:", user);
  return user;
}
  • Update user
async function updateUserCredits(email: string, newCredits: number) {
  const updatedUser = await db.user.update({
    where: {
      email,
    },
    data: {
      credits: newCredits,
    },
  });
 
  console.log("User Updated:", updatedUser);
  return updatedUser;
}
  • Delete user
async function deleteUserByEmail(email: string) {
  const deletedUser = await db.user.delete({
    where: {
      email,
    },
  });
 
  console.log("User Deleted:", deletedUser);
  return deletedUser;
}