UNPKG

@nuxt/nitro-server

Version:

Nitro server integration for Nuxt

58 lines (57 loc) 3.1 kB
import { isJsonRequest } from "../utils/error.mjs"; import { generateErrorOverlayHTML } from "../utils/dev.mjs"; import { joinURL, withQuery, withoutBase } from "ufo"; import { appendResponseHeader, getRequestHeaders, send, setResponseHeader, setResponseHeaders, setResponseStatus } from "h3"; import { useNitroApp, useRuntimeConfig } from "nitropack/runtime"; //#region src/runtime/handlers/error.ts var error_default = async function errorhandler(error, event, { defaultHandler }) { if (event.handled || isJsonRequest(event)) return; const defaultRes = await defaultHandler(error, event, { json: true }); const status = error.status || error.statusCode || 500; if (status === 404 && defaultRes.status === 302) { setResponseHeaders(event, defaultRes.headers); setResponseStatus(event, defaultRes.status, defaultRes.statusText); return send(event, JSON.stringify(defaultRes.body, null, 2)); } if (import.meta.dev && typeof defaultRes.body !== "string" && Array.isArray(defaultRes.body.stack)) defaultRes.body.stack = defaultRes.body.stack.join("\n"); const errorObject = defaultRes.body; const url = new URL(errorObject.url); errorObject.url = withoutBase(url.pathname, useRuntimeConfig(event).app.baseURL) + url.search + url.hash; errorObject.message = error.unhandled ? errorObject.message || "Server Error" : error.message || errorObject.message || "Server Error"; errorObject.data ||= error.data; errorObject.statusText ||= error.statusText || error.statusMessage; delete defaultRes.headers["content-type"]; delete defaultRes.headers["content-security-policy"]; setResponseHeaders(event, defaultRes.headers); const reqHeaders = getRequestHeaders(event); const res = event.path.startsWith("/__nuxt_error") || !!reqHeaders["x-nuxt-error"] ? null : await useNitroApp().localFetch(withQuery(joinURL(useRuntimeConfig(event).app.baseURL, "/__nuxt_error"), errorObject), { headers: { ...reqHeaders, "x-nuxt-error": "true" }, redirect: "manual" }).catch(() => null); if (event.handled) return; if (!res) { const { template } = await import("../templates/error-500.mjs"); if (import.meta.dev) errorObject.description = errorObject.message; setResponseHeader(event, "Content-Type", "text/html;charset=UTF-8"); return send(event, template(errorObject)); } const html = await res.text(); for (const [header, value] of res.headers.entries()) { if (header === "set-cookie") { appendResponseHeader(event, header, value); continue; } setResponseHeader(event, header, value); } setResponseStatus(event, res.status && res.status !== 200 ? res.status : defaultRes.status, res.statusText || defaultRes.statusText); if (import.meta.dev && !import.meta.test && typeof html === "string") { const prettyResponse = await defaultHandler(error, event, { json: false }); if (typeof prettyResponse.body === "string") return send(event, html.replace("</body>", `${generateErrorOverlayHTML(prettyResponse.body, { startMinimized: 300 <= status && status < 500 })}</body>`)); } return send(event, html); }; //#endregion export { error_default as default };