Files
nexus-terminal/packages/backend/src/database.ts
T
Baobhan Sith a974b8b1d9 update
2025-04-14 22:51:05 +08:00

60 lines
2.0 KiB
TypeScript

import sqlite3 from 'sqlite3';
import path from 'path';
import fs from 'fs';
// 数据库文件路径 (相对于 backend 项目根目录)
const dbDir = path.resolve(__dirname, '../../data'); // 使用 '../../data' 定位到 monorepo 根目录下的 data 文件夹
const dbPath = path.join(dbDir, 'nexus-terminal.db');
// 确保数据库目录存在
if (!fs.existsSync(dbDir)) {
fs.mkdirSync(dbDir, { recursive: true });
console.log(`数据库目录已创建: ${dbDir}`);
}
// 使用详细模式以获得更丰富的错误信息
const verboseSqlite3 = sqlite3.verbose();
// 创建并连接数据库
// 使用单例 (singleton) 模式确保只有一个数据库连接实例
let dbInstance: sqlite3.Database | null = null;
export const getDb = (): sqlite3.Database => {
if (!dbInstance) {
dbInstance = new verboseSqlite3.Database(dbPath, (err) => {
if (err) {
console.error('打开数据库时出错:', err.message);
// 在实际应用中,这里可能需要更健壮的错误处理,例如直接退出进程
process.exit(1);
} else {
console.log(`已连接到 SQLite 数据库: ${dbPath}`);
// 可选:启用外键约束 (如果数据库设计中使用了外键)
// dbInstance.run('PRAGMA foreign_keys = ON;', (pragmaErr) => {
// if (pragmaErr) {
// console.error('启用外键约束失败:', pragmaErr.message);
// }
// });
}
});
}
return dbInstance;
};
// 优雅停机:在应用接收到中断信号 (如 Ctrl+C) 时关闭数据库连接
process.on('SIGINT', () => {
if (dbInstance) {
dbInstance.close((err) => {
if (err) {
console.error('关闭数据库时出错:', err.message);
} else {
console.log('数据库连接已关闭。');
}
process.exit(0);
});
} else {
process.exit(0);
}
});
export default getDb;