状态码非200 响应

有时需要使用 200 以外的 HTTP 状态代码进行响应。 在这种情况下,响应处理程序 是 确定应返回什么状态代码的地方。

假定目录结构:

src/
└── routes/
    └── product/
        └── [skuId]/
            └── index.tsx     # https://example.com/product/1234

404 - Not Found

假设用户向无效的 skuId 发出请求,例如 https://example.com/product/999 。 在这种情况下,我们想返回一个 404 HTTP 状态码并渲染一个 404 页面。 我们通过查看数据库来确定请求是否有效的地方是在 请求处理程序(request handler)中。 即使响应不是 200,组件仍然有机会渲染页面(重定向情况除外。)

// File: src/routes/product/[skuId]/index.tsx
import { component$ } from '@builder.io/qwik';

type EndpointData = ProductData | null;

interface ProductData {
  skuId: string;
  price: number;
  description: string;
}
export const onGet: RequestHandler<EndpointData> = async ({ params, response }) => {
  const product = await loadProductFromDatabase(params.skuId);

  if (!product) {
    // Product data not found
    // but the data is still given to the renderer to decide what to do
    response.status = 404;
    return null;
  } else {
    // ...
  }
};

export default component$(() => {
  const resource = useEndpoint<typeof onGet>(); //equivalent to useEndpoint<EndpointData>

  if (resource.state == 'resolved' && !resource.resolved) {
    // Early return for 404
    return <div>404: Product not found!!!</div>;
  }

  // Normal rendering
  return (
    <Resource
      value={resource}
      onPending={() => <div>Loading...</div>}
      onError={() => <div>Error</div>}
      onResolved={() => (
        <>
          <h1>Product: {product.productId}</h1>
          <p>Price: {product.price}</p>
          <p>{product.description}</p>
        </>
      )}
    />
  );
});
Made with ❤️ by