預設情況下,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
,那麼這是您的程式碼處理的預期流程。如果您也希望記錄或將這些發送到外部服務,則應在您拋出回應時完成。