为 SvelteKit 中的 load() 函数引发的异常设置状态代码
Setting status code for exception raised in load() function in SvelteKit
我有一个 load()
路由函数,如果后端正在维护,它可能会抛出“维护模式”错误。这可能发生在 __layout
、load()
或前端的其他地方:
function load() {
if(looksLikeDataIsUnderMaintennce) throw new UnderMaintenanceError();
}
然后我在 __error.svelte
中捕获此错误以显示更具体的错误消息,而不是“HTTP 500 We are on fire”。
<script context="module">
/** @type {import('@sveltejs/kit').Load} */
export function load({error, status}) {
const maintenance = error.name === "UnderMaintenanceError";
return {
props: {
title: `${status}`,
message: error.message,
maintenance: maintenance,
}
};
}
</script>
<script>
export let maintenance;
</script>
<div class="container">
{#if maintenance}
<h1 class="text-center">{chainName} data under maintenance, we are back in X minutes</h1>
{:else}
<h1 class="text-center">HTTP {title} error</h1>
<pre>{message}</pre>
{/if}
</div>
默认情况下,SvelteKit 提供 HTTP 状态代码 500(内部错误)的异常。为了维护,我想将 HTTP 状态代码从 500 更改为更具体的 HTTP 503 Service Unavailable
,因为这是用于维护和暂时不可用的首选 HTTP 状态代码。我找不到直接的方法来做到这一点 - 从 __error.load
返回 status
似乎没有用。
有没有办法更改 SvelteKit 中抛出的异常和错误处理程序的 HTTP 状态代码?
您可以 return 带有 status
属性 的对象,例如 this example from the docs。这将自动显示错误页面。如果您想了解有关错误的更多信息,可以传递更多道具。
所以像这样:
export async function get() {
// If under maintenance
return {
status: 503
};
}
更新:
出于某种原因,我无法在 get
端点函数中传播错误消息,因此如果您想传递错误,似乎您需要使用 load
该页面的功能,如下所示:
<script lang='ts' context='module'>
export function load({ error }) {
console.log(error);
return {
status: 503,
error: new UnderMaintenanceError(),
}
}
</script>
我不知道是我遗漏了什么还是只是一个错误。
根据 Odilf 的回答,我们可以在 __layout
的 load()
函数中做到这一点:
<script context="module">
import { checkChainMaintenance } from "$lib/chain/maintenance";
/** @type {import('@sveltejs/kit').Load} */
export function load({ params }) {
// Check for the data maintenance status.
// If under maintenance, trigger __error with a special
// layout and message.
try {
checkChainMaintenance(params.chain);
} catch(error) {
return { status: 503, error };
}
return {};
}
</script>
<slot />
我有一个 load()
路由函数,如果后端正在维护,它可能会抛出“维护模式”错误。这可能发生在 __layout
、load()
或前端的其他地方:
function load() {
if(looksLikeDataIsUnderMaintennce) throw new UnderMaintenanceError();
}
然后我在 __error.svelte
中捕获此错误以显示更具体的错误消息,而不是“HTTP 500 We are on fire”。
<script context="module">
/** @type {import('@sveltejs/kit').Load} */
export function load({error, status}) {
const maintenance = error.name === "UnderMaintenanceError";
return {
props: {
title: `${status}`,
message: error.message,
maintenance: maintenance,
}
};
}
</script>
<script>
export let maintenance;
</script>
<div class="container">
{#if maintenance}
<h1 class="text-center">{chainName} data under maintenance, we are back in X minutes</h1>
{:else}
<h1 class="text-center">HTTP {title} error</h1>
<pre>{message}</pre>
{/if}
</div>
默认情况下,SvelteKit 提供 HTTP 状态代码 500(内部错误)的异常。为了维护,我想将 HTTP 状态代码从 500 更改为更具体的 HTTP 503 Service Unavailable
,因为这是用于维护和暂时不可用的首选 HTTP 状态代码。我找不到直接的方法来做到这一点 - 从 __error.load
返回 status
似乎没有用。
有没有办法更改 SvelteKit 中抛出的异常和错误处理程序的 HTTP 状态代码?
您可以 return 带有 status
属性 的对象,例如 this example from the docs。这将自动显示错误页面。如果您想了解有关错误的更多信息,可以传递更多道具。
所以像这样:
export async function get() {
// If under maintenance
return {
status: 503
};
}
更新:
出于某种原因,我无法在 get
端点函数中传播错误消息,因此如果您想传递错误,似乎您需要使用 load
该页面的功能,如下所示:
<script lang='ts' context='module'>
export function load({ error }) {
console.log(error);
return {
status: 503,
error: new UnderMaintenanceError(),
}
}
</script>
我不知道是我遗漏了什么还是只是一个错误。
根据 Odilf 的回答,我们可以在 __layout
的 load()
函数中做到这一点:
<script context="module">
import { checkChainMaintenance } from "$lib/chain/maintenance";
/** @type {import('@sveltejs/kit').Load} */
export function load({ params }) {
// Check for the data maintenance status.
// If under maintenance, trigger __error with a special
// layout and message.
try {
checkChainMaintenance(params.chain);
} catch(error) {
return { status: 503, error };
}
return {};
}
</script>
<slot />