Files
easyimg/server/utils/db.js
T

71 lines
1.7 KiB
JavaScript

import Datastore from '@seald-io/nedb'
import { join } from 'path'
import { existsSync, mkdirSync } from 'fs'
// 数据目录:生产环境使用 /app/db,开发环境使用项目根目录下的 db
const dataDir = process.env.NODE_ENV === 'production'
? '/app/db'
: join(process.cwd(), 'db')
// 确保 db 目录存在
if (!existsSync(dataDir)) {
mkdirSync(dataDir, { recursive: true })
}
console.log('[Database] 数据目录:', dataDir)
// 创建数据库实例
const users = new Datastore({
filename: join(dataDir, 'users.db'),
autoload: true
})
const images = new Datastore({
filename: join(dataDir, 'images.db'),
autoload: true
})
const apikeys = new Datastore({
filename: join(dataDir, 'apikeys.db'),
autoload: true
})
const settings = new Datastore({
filename: join(dataDir, 'settings.db'),
autoload: true
})
// 内容审核任务表
const moderationTasks = new Datastore({
filename: join(dataDir, 'moderation_tasks.db'),
autoload: true
})
// IP 黑名单表
const ipBlacklist = new Datastore({
filename: join(dataDir, 'ip_blacklist.db'),
autoload: true
})
// Promise 化数据库操作
const promisify = (db) => ({
findOne: (query) => db.findOneAsync(query),
find: (query) => db.findAsync(query),
insert: (doc) => db.insertAsync(doc),
update: (query, update, options = {}) => db.updateAsync(query, update, options),
remove: (query, options = {}) => db.removeAsync(query, options),
count: (query) => db.countAsync(query),
ensureIndex: (options) => db.ensureIndexAsync(options)
})
export const db = {
users: promisify(users),
images: promisify(images),
apikeys: promisify(apikeys),
settings: promisify(settings),
moderationTasks: promisify(moderationTasks),
ipBlacklist: promisify(ipBlacklist)
}
export default db