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

Setting status code for exception raised in load() function in SvelteKit

我有一个 load() 路由函数,如果后端正在维护,它可能会抛出“维护模式”错误。这可能发生在 __layoutload() 或前端的其他地方:

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 的回答,我们可以在 __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 />

See full example.