60 lines
2.0 KiB
TypeScript
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;
|