设置SvelteKit中load()函数引发异常的状态码



我有一个load()路由功能,可能会抛出"维护模式";如果后端在维护中,则会出现错误。这可能发生在__layout,load()或前端的其他地方:

function load() {
if(looksLikeDataIsUnderMaintennce) throw new UnderMaintenanceError();
} 

然后我在__error.svelte中捕获这个错误,以显示更具体的错误消息,而不是"HTTP 500我们着火了"


<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似乎没有做到这一点。

是否有办法改变HTTP状态码抛出异常和错误处理程序在SvelteKit?

您可以返回一个具有status属性的对象,就像文档中的这个示例一样。这将自动显示错误页面。如果你想要更多关于错误的信息,你可以传递更多的props。

所以像这样:

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>

我不知道是我漏了什么还是只是一个bug。

根据Odilf的回答,我们可以在__layoutload()函数中做到这一点:

<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 />

查看完整示例

最新更新