Skip to content

路由处理程序、Server Action

路由处理程序

在app文件夹下创建文件,一般来说都会在app文件下创建一个api的文件夹app/api/**/route.ts

例子:

  • df
    • Sd

app/api/**/route.ts

ts
export async function GET(request: Request) {}
export async function POST(request: Request) {}

动态路由

跟page一样可以使用app/**/[id]/router.ts

ts
// app/item/[slug]/route.ts

export async function GET(
  request: Request,
  { params }: { params: Promise<{ slug: string }> }
) {
  const slug = (await params).slug // 'a', 'b', or 'c'
}

获取请求头数据

ts
import { headers } from 'next/headers'
 
export async function GET(request: Request) {
  const headersList = await headers()
  const referer = headersList.get('referer')
 
  return new Response('Hello, Next.js!', {
    status: 200,
    headers: { referer: referer },
  })
}

Cookies

ts
import { cookies } from 'next/headers'
 
export async function GET(request: Request) {
  const cookieStore = await cookies()
  const token = cookieStore.get('token')
 
  return new Response('Hello, Next.js!', {
    status: 200,
    headers: { 'Set-Cookie': `token=${token.value}` },
  })
}

设置为缓存

ts
export const dynamic = 'force-static'
 
export async function GET() {
  const res = await fetch('https://data.mongodb-api.com/...', {
    headers: {
      'Content-Type': 'application/json',
      'API-Key': process.env.DATA_API_KEY,
    },
  })
  const data = await res.json()
 
  return Response.json({ data })
}

其他受支持的HTTP方法也不会被缓存,即使它们与同一文件中的GET方法旁边放置。

获取路径上Query参数

ts
import { type NextRequest } from 'next/server'
 
export function GET(request: NextRequest) {
  const searchParams = request.nextUrl.searchParams
  const query = searchParams.get('query')
  // query is "hello" for /api/search?query=hello
}

获取Body参数

ts
export async function POST(request: Request) {
  const res = await request.json()
  return Response.json({ res })
}

...

Server Action

操作在服务器上的异步函数,在文件的顶部标记use server,和路由处理程序的区别是server action 不用使用fetch进行请求,而是像普通函数直接引入调用即可。

创建

ts
'use server'
 
export async function create() {}

使用

ts
'use client'
 
import { create } from './actions'
 
export function Button() {
  return <button onClick={() => create()}>Create</button>
}

在server action中跳转路由的方法

ts
import { redirect } from 'next/navigation';

export async function POST() {
  // 执行你的操作,如数据处理等
  // 例如:处理表单提交

  // 在操作完成后进行重定向
  redirect('/thank-you');  // 重定向到新的页面
}

路由拦截(Middleware)

用app同目录下的middleware.ts来定义中间件

ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'
 
// This function can be marked `async` if using `await` inside
export function middleware(request: NextRequest) {
  return NextResponse.redirect(new URL('/home', request.url))
}
 
// 匹配到一下配置的路径才会走middleware这个方法
export const config = {
  // matcher: '/about/:path*',
  matcher: ['/about/:path*', '/dashboard/:path*'],

}

集成lowdb增加和删除

操作json文件

安装

shell
npm i lowdb

创建文件

ts
import { JSONFilePreset } from 'lowdb/node'
const db = await JSONFilePreset('db.json', { posts: [] })

文件写入数据

ts
const post = { id: 1, title: 'lowdb is awesome', views: 100 }
await db.update(({ posts }) => posts.push(post))

获取数据

ts
const data = db.data.posts

The future is promising