这个回退组件={NotFound}是我发现错误页面的唯一方法,但返回一个服务器代码200的组件页面,我想获得代码404。
是否有不的方法使用sveltekit ?
import { Router, Link, Route } from "svelte-routing";
import NotFound from "./components/NotFound.svelte";
...
<Route path="/">
Welcome <hr />
<Login {toast}/>
</Route>
<Route component={NotFound} />
</Router>
svelte-routing
是一个基于组件的路由器,因此它无法控制您的服务器,因此除了为您选择正确的组件之外,它无法以任何方式操纵响应。您仍然可以返回不同的状态码,但需要在服务器端手动执行。
如果你正在使用静态文件托管,我认为除了在你的平台配置中列出所有有效路由之外,没有别的方法可以做到这一点,这样它就可以在有效路由上返回200,否则返回404。路由重复是不幸的,但可能是不可避免的。
然而,如果你在服务器端呈现你的应用程序,你可以与你的组件通信,以便用正确的状态码响应。在请求处理程序中,创建一个上下文对象来保存数据:
import App from './App.svelte';
import { generatePage } from './page-template.js';
function handler(request, response) {
const SSR_RESPONSE = { statusCode: 200 };
const renderedApp = App.render(
{ url: req.url },
{ context: new Map([['SSR_RESPONSE', SSR_RESPONSE]]) }
);
response.statusCode = SSR_RESPONSE.statusCode;
response.end(generatePage(renderedApp));
}
你现在可以从你的组件中读写这个对象:
<!-- NotFound.svelte -->
<script>
import { getContext } from 'svelte';
getContext('SSR_RESPONSE').statusCode = 404;
</script>
<h1>Not found</h1>
这种技术不仅可以用于状态码,还可以用于标题、条件模板或任何你能想到的东西。
注意,为了使它工作,你必须在组件初始化时设置你的上下文值。而不是在回调、异步上下文、setTimeout
等中)。这是必需的,因为SSR是同步发生的,所以当您异步更新上下文时,您的响应将已经发送。