数据与路由处理程序

从 app/api 提供部署数据,在页面中获取并提交新部署。

本章应用正在你的控制台中运行。按 ⌘⌥JCtrl+Shift+J⌘⌥KCtrl+Shift+K⌘⌥C 打开控制台(先开启开发者功能),然后试用。
观看本章3:32

本章内容

  • 路由处理程序
  • 在页面中获取数据
  • 加载和错误状态
  • 流式传输

Acme Deploys 需要真实数据。路由处理程序与页面放在同一个 app/ 目录中,使用 Web Request 和 Response API,并在 text dev 和 text start 下运行。路由处理程序与应用同源,因此请求无需配置 CORS。

路由处理程序

app/api/deployments/route.ts+10ts
新增:import { DEPLOYMENTS, createDeployment } from "../../../lib/deployments";新增:新增:export function GET(): Response {新增:  return Response.json(DEPLOYMENTS);新增:}新增:新增:export async function POST(req: Request): Promise<Response> {新增:  const deployment = createDeployment(await req.json());新增:  return Response.json(deployment, { status: 201 });新增:}

在 text dev 运行时,从控制台提示符调用:

await (await fetch("/api/deployments")).json()

在页面中获取数据

在 effect 中获取数据,并在数据到达前显示 <Spinner>。r 重新获取数据;n 提交一个新部署,初始显示为构建中,构建完成后变为就绪。

app/deployments/page.tsx+21-2tsx
移除:import { DEPLOYMENTS } from "../../lib/deployments";新增:import { useEffect, useState } from "react";新增:import { Spinner, useInput } from "@textjs/app";新增:import type { Deployment } from "../../lib/deployments";export default function DeploymentsPage() {新增:  const [rows, setRows] = useState<Deployment[]>([]);新增:  const [loading, setLoading] = useState(true);新增:新增:  const refetch = async () => {新增:    setLoading(true);新增:    setRows(await (await fetch("/api/deployments")).json());新增:    setLoading(false);新增:  };新增:  useEffect(() => void refetch(), []);新增:新增:  useInput((e) => {新增:    if (e.input === "r") void refetch();新增:    if (e.input === "n") void fetch("/api/deployments", { method: "POST", body: "{}" }).then(refetch);新增:  });新增:新增:  if (loading) return <Spinner label="Loading deployments…" />;  return (    <Box className="flex-col">移除:      {DEPLOYMENTS.map((d) => (新增:      {rows.map((d) => (        <Box key={d.id} className="flex-row h-1 gap-2">新增:          <Status status={d.status} />          …

加载和错误状态

无需手动处理 loading,页面挂起时会显示同目录下的 loading.tsx,而 error.tsx 会捕获页面抛出的所有错误。两者都是普通组件:

app/deployments/loading.tsxtsx
import { Spinner } from "@textjs/app";export default function Loading() {  return <Spinner label="Loading deployments…" />;}

流式传输

处理程序可以返回 ReadableStream,构建日志就是这样逐行流入仪表盘的。有关服务器发送事件和代理本地守护进程的说明,请参阅路由处理程序。

试用

这是本章结束时的 Acme Deploys,正在 DevTools 中运行。点击输入区,然后使用下列按键。

▼ 06 · 数据与路由处理程序

打开控制台

⌘⌥J
CtrlShiftJ
⌘⌥K
CtrlShiftK
⌘⌥C

应用在 DevTools 中渲染。先在 Safari 设置 → 高级中开启“显示网页开发者功能”。 然后点击这里并按 r。

在桌面端打开

此应用在 DevTools 控制台中渲染,需要桌面浏览器。

测验

2 个问题

回答所有问题以完成本章。

路由处理程序返回什么?

 

路由挂起时显示哪个文件?