如何在SvelteKit应用启动时执行代码



我有一个基于SvelteKit的应用程序在开发。在服务器启动时,无论是在开发服务器启动上,还是在Node.js适配器启动上,我想执行一些诊断命令。此类操作的一个示例是ping后端服务器,如果后端无法访问,则提前失败。这将主要是服务器端呈现的问题,但如果它很容易,我也想将其应用于静态部署。

在这样的代码中放置什么是最好的钩子?

还有,用错误消息中止应用程序启动的优雅方式是什么?

到目前为止,似乎终于有了一个官方的答案:

https://kit.svelte.dev/docs/hooks

钩子

[…]

有两个钩子文件,都是可选的:

  • src/hooks.server.js -你的应用程序的服务器钩子
  • src/hooks.client.js -你的应用的客户端钩子

这些模块中的代码将在应用程序启动时运行,使它们用于初始化数据库客户端等。

[…]

所以,是的,只要把你的代码放在一个hook.js文件中(一个顶级文件,而不是一个函数),它就会在启动时运行。

编辑:正如leumasme (https://github.com/sveltejs/kit/issues/927#issuecomment-1349637401)所尝试的那样,这只适用于发布版本。在开发模式下,代码只对第一个请求执行。所以请记住这一点。

接受的答案不回答问题。服务器钩子在每个请求或每个错误中运行一次。它们与服务器生命周期无关,也不是初始化数据库或预加载站点范围数据的合适位置。现在我正在寻找一种方法来做到这一点。

https://kit.svelte.dev/docs/hooks

我猜答案就在一个或多个适配器中。

我相信这可以用钩子来完成。这是一个关于这里问的问题的例子,它将在页面加载时获得用户代理。

src文件夹内创建hooks.js:

export function getSession(request) {
return {
userAgent: request.headers['user-agent']
}
}

然后你可以在你想要的每个组件的load函数中使用它:

<script context="module">
export async function load({ session }) {
console.log(session.userAgent)
}
</script>

由苗条大使{🧪}pablopang在苗条的Discord频道解决。引言:

if you run the code inside the module of hooks.server.ts 
it will be exected only once
what i mean is that you need to run right inside hooks.server.ts 
not in the exported handle function
obviosuly be aware of the fact that if you deploy on serverless 
every new lambda spin up will run that code 
but that should be good since it's like if you just spun up the server

提供了正确的答案,但我想给出一个如何工作的示例。只需将要在服务器启动时执行的代码放在src/hooks.server.js

中例如

import * as db from '$lib/server/database';
console.log("Startup sequence initiated.");
db.load(); // this line will be executed only once during server startup
console.log("Startup sequence complete.");

最新更新