默认情况下,Remix 将为您处理生成 HTTP 响应。如果您想自定义此行为,可以运行 npx remix reveal
来生成一个 app/entry.server.tsx
(或 .jsx
),它将优先执行。此模块的 default
导出是一个函数,允许您创建响应,包括 HTTP 状态、标头和 HTML,让您可以完全控制标记的生成方式和发送到客户端的方式。
此模块应使用带有当前请求的 context
和 url
的 <RemixServer>
元素呈现当前页面的标记。一旦 JavaScript 在浏览器中使用浏览器入口模块加载,此标记将(可选地)重新水合。
handleDataRequest
您可以导出一个可选的 handleDataRequest
函数,该函数允许您修改数据请求的响应。这些是不呈现 HTML 的请求,而是在客户端水合发生后将加载器和操作数据返回到浏览器。
export function handleDataRequest(
response: Response,
{
request,
params,
context,
}: LoaderFunctionArgs | ActionFunctionArgs
) {
response.headers.set("X-Custom-Header", "value");
return response;
}
handleError
默认情况下,Remix 会将遇到的服务器端错误记录到控制台。如果您想要更多地控制日志记录,或者还想将这些错误报告给外部服务,那么您可以导出一个可选的 handleError
函数,该函数将为您提供控制(并禁用内置的错误日志记录)。
export function handleError(
error: unknown,
{
request,
params,
context,
}: LoaderFunctionArgs | ActionFunctionArgs
) {
if (!request.signal.aborted) {
sendErrorToErrorReportingService(error);
console.error(formatErrorForJsonLogging(error));
}
}
请注意,通常您希望避免在请求被中止时进行日志记录,因为 Remix 的取消和竞争条件处理可能会导致大量请求被中止。
当您通过 renderToPipeableStream
或 renderToReadableStream
流式传输 HTML 响应时,您自己的 handleError
实现只会处理初始 shell 渲染期间遇到的错误。如果在后续流式渲染期间遇到渲染错误,您需要手动处理这些错误,因为 Remix 服务器此时已经发送了响应。
renderToPipeableStream
,您可以在 onError
回调函数中处理这些错误。您需要在 onShellReady
中切换一个布尔值,以便您知道该错误是 shell 渲染错误(可以忽略)还是异步渲染错误(必须处理)。entry.server.tsx
。renderToReadableStream
,您可以在 onError
回调函数中处理这些错误entry.server.tsx
请注意,这不会处理从您的 loader
/action
函数抛出的 Response
实例。此处理程序的目的是查找代码中导致意外抛出错误的错误。如果您在 loader
/action
中检测到某种情况并抛出 401/404 等 Response
,那么这是代码处理的预期流程。如果您还希望记录这些响应或将其发送到外部服务,则应在抛出响应时进行。