首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何优雅地关闭sveltekit?

如何优雅地关闭sveltekit?
EN

Stack Overflow用户
提问于 2022-10-10 21:13:44
回答 1查看 99关注 0票数 1

我在一个sveltekit web应用程序中使用适配器节点和mysql池。

以前,我只使用nodejs和express,而不使用sveltekit,我发现我需要完全关闭mysql池连接,否则mysql在重新启动应用程序时可能挂起。

我有过这样的事情:

代码语言:javascript
复制
  process.on('SIGINT', () => server.close(() => pool.end()));

我如何在一个sveltekit应用程序中实现同样的结果?或者它没有必要(以及为什么)?

我可以在sveltekit实现中看到它创建服务器的地方,但似乎没有任何方法访问它,因此我可以调用close()。我认为在服务器关闭之前调用pool.end()是不安全的。

在sveltekit文档中,我也找不到任何关于优雅关闭的讨论。有一个github问题,但它在一年多前就被关闭了,而这个更改已经从代码中删除了。

我在svelte github中发现了一个类似的问题。它没有决议,因此很可能还没有正式的解决办法。https://github.com/sveltejs/kit/issues/6841

EN

回答 1

Stack Overflow用户

发布于 2022-10-10 23:22:48

在撰写本答复时的免责声明:

general

  • SvelteKit adapter-node

  • I是Svelte和SvelteKit的新手,只有几年的时间才在上开发,并且可能会改变
    • ,我不能100%确定这个答案能解决我使用adapter-node

    的所有

  • 的情况。

SvelteKit目前建议在src/hooks.server.ts中执行一次设置代码.因此,当谈到优雅的关闭时,我只会担心关闭我在src/hooks.server.ts中设置的东西。

简单的答案是为执行任何所需清理的process.on()SIGINT设置exit处理程序。

使用adapter-node时设置和关闭mysql数据库池的示例

代码语言:javascript
复制
// src/hooks.server.ts

// One time setup code
await import('./db.js');

// ... remaining hooks.server.ts code
代码语言:javascript
复制
// src/db.ts

import { PRIVATE_MYSQL_PASSWORD } from '$env/static/private';
import type { Pool, PoolConnection, MysqlError } from 'mysql';
import { createPool } from 'mysql';

const pool = createPool({
  connectionLimit: 10,
  host: 'localhost',
  user: 'root',
  password: PRIVATE_MYSQL_PASSWORD,
  database: 'my_db',
  multipleStatements: false,
  timezone: 'UTC',
  dateStrings: ['DATE', 'DATETIME'],
});

process.on('exit', (code) => end_db_pool(pool));
process.on('SIGINT', () => end_db_pool(pool));

function end_db_pool(pool: any) {
  pool.getConnection(function (err, connection) {
    connection.query('select 1 from my_table;', function (err, rows) {
      connection.release();
      // pool.end() only works inside getConnection();
      pool.end((err) => {
        if (err) log('pool.end err: ' + err);
      });
    });
  });
}

// ... remaining API for DB operations using the pool

我尝试过并可能仍然有用的另一个解决方案是创建一个自定义适配器。我将adapter-node代码复制到我的项目中,并对files/index.js进行了一些实验。现在,我使用的是上面的代码,而不是定制的adapter-node

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74020726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档