node-weibo-simulation-api
Version:
145 lines (139 loc) • 4.52 kB
JavaScript
/**
* kv存储
*/
const memeryStoreMap = {};//内存级别的存储
const fse = require('fs-extra');//文件存储
const path = require('path');
const {NO_CACHE} = require('../constans/code');
const mkdirp = require('mkdirp');
const config = require('rc')('weibo',{
"tokenFolders":"./tokens"//token存储的文件夹
})
/*
const store = new Store();
store.set('key',{"key":"value"},5000).then(()=>{
store.get('key').then(data=>{
console.log('data',typeof(data),data);
return true;
}).then(()=>{
return new Promise((resolve,reject)=>{
setTimeout(()=>{
console.log('6s');
return resolve()
},6000)
})
}).then(()=>{
return store.get('key').catch(e=>{
console.log('e',e);
return true;
})
}).then((data)=>{
console.log('data',data);
})
})
*/
class Store {
constructor(params) {
this.type = 'file';//本地文件存储
}
async set(key,value,cacheTime) {
//设置store
if (!cacheTime) { //如果没有cacheTime,说明是永久
cacheTime = -1;//表示永久,毫秒
}
const struct = {};
struct.version = 'storev1';
struct.cacheTime = cacheTime===-1?-1:((new Date()).getTime() + parseInt(cacheTime, 10));
struct.type = typeof(value);
// console.log('value',value);
if(struct.type === 'object'){
struct.value = JSON.stringify(value);
}else{
struct.value = value;
}
try {
memeryStoreMap[key] = struct;
let filePath = path.join(__dirname,'../',config.tokenFolders,`${key}.json`);
await mkdir(path.dirname(filePath))
await fse.writeJson(filePath,struct);
return Promise.resolve(struct);
} catch (e) {
console.log(e);
return Promise.reject(e);
}
}
async get(key) {
// console.log('get Store key',key);
//获取store内容
let json = memeryStoreMap[key];
// console.log('memery ',json);
if(!json){
try{
let jsonPath = path.join(__dirname,'../',config.tokenFolders,`${key}.json`);
// console.log('jsonPath',jsonPath);
json = await fse.readJson(jsonPath);
}catch(e){
return Promise.reject({
code:NO_CACHE,
msg:'内容为空'
});
}
}
if (!json) {
return Promise.reject({
code:NO_CACHE,
msg:'内容为空'
});
}
// console.log('json',json);
if (json.version === 'storev1') {
//检查cache是否有效
// console.log('json.cacheTime',json.cacheTime);
// console.log('new Date() ',new Date());
if (json.cacheTime >= new Date() || json.cacheTime===-1) {
memeryStoreMap[key] = json;//缓存到内存里
//判断类型
if(json.type === 'object'){
try {
var parseValue = JSON.parse(json.value);
} catch (error) {
return Promise.reject(error);
}
return parseValue;
}else{
return json.value;
}
} else {
try{
await this.remove(key);
}catch(e){
console.error('remove fail',e);
}
return Promise.reject({
code:NO_CACHE,
msg:'内容为空'
});
}
} else {
return json.value;
}
}
async remove(key) {
delete memeryStoreMap[key];
try {
await fse.remove(path.join(__dirname,'../',config.tokenFolders,`${key}.json`));
} catch (error) {
return Promise.reject(error);
}
return Promise.resolve()
}
}
function mkdir(path){
return new Promise((s,f)=>{
mkdirp(path, function (err) {
if (err) return f(err)
else return s()
});
})
}
module.exports = Store;