我在一个sveltekit web应用程序中使用适配器节点和mysql池。
以前,我只使用nodejs和express,而不使用sveltekit,我发现我需要完全关闭mysql池连接,否则mysql在重新启动应用程序时可能挂起。
我有过这样的事情:
process.on('SIGINT', () => server.close(() => pool.end()));我如何在一个sveltekit应用程序中实现同样的结果?或者它没有必要(以及为什么)?
我可以在sveltekit实现中看到它创建服务器的地方,但似乎没有任何方法访问它,因此我可以调用close()。我认为在服务器关闭之前调用pool.end()是不安全的。
在sveltekit文档中,我也找不到任何关于优雅关闭的讨论。有一个github问题,但它在一年多前就被关闭了,而这个更改已经从代码中删除了。
我在svelte github中发现了一个类似的问题。它没有决议,因此很可能还没有正式的解决办法。https://github.com/sveltejs/kit/issues/6841
发布于 2022-10-10 23:22:48
在撰写本答复时的免责声明:
general
adapter-node的
adapter-node的所有
SvelteKit目前建议在src/hooks.server.ts中执行一次设置代码.因此,当谈到优雅的关闭时,我只会担心关闭我在src/hooks.server.ts中设置的东西。
简单的答案是为执行任何所需清理的process.on()和SIGINT设置exit处理程序。
使用adapter-node时设置和关闭mysql数据库池的示例
// src/hooks.server.ts
// One time setup code
await import('./db.js');
// ... remaining hooks.server.ts code// 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。
https://stackoverflow.com/questions/74020726
复制相似问题