Gcp/Firebase/Firestore/cacheモジュール/async
提供: 初心者エンジニアの簡易メモ
asyncを使ったfunctionsのcacheサンプル
functions/index.js
const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(); const cache = require('./cache.js'); exports.setCache = functions .region('asia-northeast1') .https.onRequest(async(request, response) => { var id = request.query['id']; var cachedata = request.query['cachedata']; var retcachedata = await cache.setCache(admin, cachedata, id); response.send("retcachedata=" + retcachedata); }); exports.getCache = functions .region('asia-northeast1') .https.onRequest(async(request, response) => { var id = request.query['id']; var cachedata = request.query['cachedata']; var cachelifesec = 60 * 60; if (request.query['cachelifesec'] != null) { cachelifesec = parseInt(request.query['cachelifesec']); } console.log('cachelifesec=' + cachelifesec); var cachedata = await cache.getCache(admin, id, cachelifesec); response.send("cachedata=" + cachedata); });
functions/cache.js
/* Cache設定例 const cache = require('./cache.js'); cache.registerCallbackSetCache(onCacheResponseSetCache); var data = "hogehoge"; var data = await cache.setCache(admin, data, id); return data; // hogehoge Cache取得例(functionをasyncで宣言しておく) const cache = require('./cache.js'); console.log('cachelifesec=' + cachelifesec); var data = await cache.getCache(admin, id, cachelifesec); response.send("data=" + data); */ exports.setCache = async function(admin, data, id) { var date = new Date() ; var unixtimems = date.getTime() ; var unixtime = Math.floor( unixtimems / 1000 ) ; console.log('unixtime=' + unixtime); const cache = { id: id, data: data, unixtime: unixtime, }; var snapshot = await admin.firestore().collection('caches') .doc(id).set(cache); return ""; } exports.getCache = async function(admin, id, cachelifesec) { console.log('exports.getCache'); var date = new Date() ; var unixtimems = date.getTime() ; var unixtime = Math.floor( unixtimems / 1000 ) ; console.log('unixtime=' + unixtime); var unixtimecachelifesec = unixtime - cachelifesec; console.log('cachelifesec=' + cachelifesec); console.log('unixtimecachelifesec=' +unixtimecachelifesec); var snapshot = await admin.firestore().collection('caches') .where('id', '==', id) .where('unixtime', '>', unixtimecachelifesec) .limit(1) .get(); var caches = snapshot.docs.map(x => x.data()); for (let i = 0; i < caches.length; i++) { console.log("ret data=" + caches[i].data); console.log("getCache cache=" + caches[i].data); return caches[i].data; } console.log("getCache nasi"); return ""; }
httpアクセスで確認
10秒でcacheが切れるサンプルurl
// cache設定 ttps://asia-northeast1-ほげほげ.cloudfunctions.net/setCache?id=hogeid&cachedata=dada1 // cache取得 ttps://asia-northeast1-ほげほげ.cloudfunctions.net/getCache?id=hogeid&cachelifesec=10
cacheはid別にfirestoreに格納される。