数据访问对象模式(Data access object-DAO)
抽象和封装对数据源的访问与存储,DAO通过对数据源链接的管理方便对数据的访问与存储
封装本地存储
/**
* 定义本地存储类
* @param preId 存储库前缀
*/
const BaseLocalStorage = function (preId) {
this.preId = preId;
};
// 本地存储类原型方法
BaseLocalStorage.prototype = {
// 状态
state: {
FAILURE: 0, // 失败
SUCCESS: 1, // 成功
OVERFLOW: 2, // 溢出
},
// 存储工具
storage: localStorage || window.localStorage,
// 获取数据库的真是字段
getKey(key) {
return this.preId + key;
},
/**
* 新增/修改 数据到数据库
* @param key 不带前缀的属性
* @param value 值
* @param callback 回调(传入 `状态,key,值`)
*/
set(key, value, callback) {
let state = this.state.SUCCESS;
let realKey = this.getKey(key); // 真实key
try {
this.storage.setItem(realKey, value);
} catch (e) {
// 存不进去了,返回溢出窗台
state = this.state.OVERFLOW;
}
callback && callback.call(this, {
state, key, value});
},
/**
* 查询数据到数据库
* @param key 不带前缀的属性
* @param callback 回调(传入 `状态,key,值`)
*/
get(key, callback) {
let state = this.state.SUCCESS;
let realKey = this.getKey(key); // 真实key
let value = null;
try {
value = this.storage.getItem(realKey);
} catch (e) {
// 获取失败
state = this.state.FAILURE;
}
callback && callback.call(this, {
state, key, value});
},
/**
* 删除数据
* @param key 不带前缀的属性
* @param callback 回调(传入 `状态,key`)
*/
remove(key, callback) {
let state = this.state.SUCCESS;
let realKey = this.getKey(key); // 真实key
try {
this.storage.removeItem(realKey);
} catch (e) {
// 获取失败
state = this.state.FAILURE;
}
callback && callback.call(this, {
state, key});
}
};
const s = new BaseLocalStorage('Lee-');
s.set('name', 'Lee', function ({
state, key, value}) {
console.log(state, key, value); // 1 'name' 'Lee'
});
s.get('name', function ({
state, key, value}) {
console.log(state, key, value); // 1 'name' 'Lee'
});
s.remove('name', function ({
state, key}) {
console.log(state, key); // 1 'name'
});
s.get('name', function ({
state, key, value}) {
console.log(state, key, value); // 1 'name' null
});
MongoDB
config.js
module.exports = { // 数据库相关配置数据 DB: { db: 'demo', // 数据库名称 host: '192.168.3.91', // 主机名 port: 27017, // 端口号 } };
db.js
const { MongoClient } = require('mongodb'); const config = require('./config').DB; // 创建数据库对象 const url = `mongodb://${config.host}:${config.port}`; const mongoClient = new MongoClient(url); /** * 连接数据库 * @param {string} col 表名 * @param {Function} fn 回调 */ function connect(col, fn) { mongoClient.connect() .then(client => { const db = client.db(config.db); const collection = db.collection(col); fn && fn(collection, client); }) .catch(err => { throw err; }); } // 输出数据访问对象 exports.DB = function (col) { return { /** * 插入一条数据 * @param {data, success, fail} param * data 插入数据 * success 成功回调 * fail 失败回调 */ insertOne({ data, success = () => { }, fail = () => { } }) { connect(col, (collection, client) => { collection.insertOne(data) .then(res => success(res)) .catch(err => fail(err)) .finally(() => client.close()); // 关闭数据库 }); }, /** * 删除一条数据 * @param {data, success, fail} param * q 查询数据 * success 成功回调 * fail 失败回调 */ deleteMany({ q, success = () => { }, fail = () => { } }) { connect(col, (collection, client) => { collection.deleteMany(q) .then(res => success(res)) .catch(err => fail(err)) .finally(() => client.close()); }); }, /** * 修改一条数据 * @param {data, success, fail} param * q 查询数据 * data 修改数据 * success 成功回调 * fail 失败回调 */ updateOne({ q, data, success = () => { }, fail = () => { } }) { connect(col, (collection, client) => { collection.updateOne(q, { $set: data }) .then(res => success(res)) .catch(err => fail(err)) .finally(() => client.close()); }); }, /** * 查询数据 * @param {data, success, fail} param * q 查询数据 * success 成功回调 * fail 失败回调 */ find({ q, success = () => { }, fail = () => { } }) { connect(col, (collection, client) => { collection.find(q).toArray((err, res) => { if (err) { fail(err); } else { success(res); } client.close() }); }); }, }; };
app.js
const DB = require('./db').DB; // 操作user表 const user = DB('user'); // 增 user.insertOne({ data: { name: 'Lee', age: 18, desc: '简介啦~~~' }, success(res) { console.log(res); }, fail(err) { console.log(err.message); } }); // 删 user.deleteMany({ q: { name: 'Lee' }, success(res) { console.log(res); }, fail(err) { console.log(err.message); } }); // 改 user.updateOne({ q: { name: 'Lee' }, data: { age: 20 }, success(res) { console.log(res); }, fail(err) { console.log(err.message); } }); // 查 user.find({ q: { }, success(res) { console.log(res); }, fail(err) { console.log(err.message); } }); const book = DB('book'); // 增 book.insertOne({ data: { name: '《Tom》', desc: '简介啦~~~' }, success(res) { console.log(res); }, fail(err) { console.log(err.message); } });