在repl.it平台上与express连接时,我经常会损坏Sqlite3数据库。我正在使用数据访问类->存储库模式
来自app.js的代码段:
const AppDAO = require('./data/dao');
...
const dao = new AppDAO('./db.sqliteMaptack');
const mapTierRepo = new MapTierRepository(dao);
mapTierRepo.createTable();
dao类:
const sqlite3 = require('sqlite3')
const Promise = require('bluebird')
class AppDAO {
constructor(dbFilePath) {
this.db = new sqlite3.Database(dbFilePath, (err) => {
if (err) {
console.log('Could not connect to database', err);
} else {
console.log('Connected to database');
}
})
}
run(sql, params = []) {
return new Promise((resolve, reject) => {
this.db.run(sql, params, function (err) {
if (err) {
console.log('Error running sql ' + sql);
console.log(err);
reject(err);
} else {
resolve({ id: this.lastID });
}
})
})
}
get(sql, params = []) {
return new Promise((resolve, reject) => {
this.db.get(sql, params, (err, result) => {
if (err) {
console.log('Error running sql: ' + sql);
console.log(err);
reject(err);
} else {
resolve(result);
}
})
})
}
all(sql, params = []) {
return new Promise((resolve, reject) => {
this.db.all(sql, params, (err, rows) => {
if (err) {
console.log('Error running sql: ' + sql);
console.log(err);
reject(err)
} else {
resolve(rows);
}
})
})
}
}
module.exports = AppDAO;
存储库:
class MapTierRepository {
constructor(dao) {
this.dao = dao;
}
createTable() {
const sql =
'CREATE TABLE IF NOT EXISTS MapTier (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT)';
return this.dao.run(sql);
}
create(name) {
return this.dao.run(
'INSERT INTO MapTier (name) VALUES (?)',
[name]);
}
update(mapTier) {
const { id, name } = mapTier
return this.dao.run(
'UPDATE MapTier SET name = ? WHERE id = ?',
[name, id]
);
}
delete(id) {
return this.dao.run(
'DELETE FROM MapTier WHERE id = ?',
[id]
);
}
getById(id) {
return this.dao.get(
'SELECT * FROM MapTier WHERE id = ?',
[id]);
}
getAll() {
return this.dao.all('SELECT * FROM MapTier');
}
}
module.exports = MapTierRepository;
所有存储库方法均有效。但是,当repl.it实例崩溃时,可能会导致数据库损坏,有什么想法吗?