UNPKG

node-weibo-simulation-api

Version:
145 lines (139 loc) 4.52 kB
/** * 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;