facebook twitter hatena line email

「Gcp/Firebase/Firestore/cacheモジュール」の版間の差分

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
 
行1: 行1:
==functionsのサンプル==
+
[[Gcp/Firebase/Firestore/cacheモジュール/基本]]
*id別にfirestoreのcahesコレクションへ文字列をキャッシュする
+
*cache保持時間を設定できるように
+
  
cachesのテーブル構成例
+
[[Gcp/Firebase/Firestore/cacheモジュール/async]]
id string | data string | unixtime int
+
"hogeid" | "hoge" | 123423451
+
 
+
functions/index.js
+
<pre>
+
const functions = require('firebase-functions');
+
const admin = require('firebase-admin');
+
admin.initializeApp();
+
exports.setCache = functions
+
  .region('asia-northeast1')
+
  .https.onRequest((request, response) => {
+
    var id = request.query['id'];
+
    var cachedata = request.query['cachedata'];
+
    const cache = require('./cache.js');
+
    cache.registerCallback(onCacheResponse);
+
    cache.setCache(admin, cachedata, id);
+
    function onCacheResponse(cachedata) {
+
      response.send("cachedata=" + cachedata);
+
    }
+
});
+
 
+
exports.getCache = functions
+
  .region('asia-northeast1')
+
  .https.onRequest((request, response) => {
+
    var id = request.query['id'];
+
    var cachedata = request.query['cachedata'];
+
    var cachelifesec = 0;
+
    if (request.query['cachelifesec'] != null) {
+
      cachelifesec = parseInt(request.query['cachelifesec']);
+
    }
+
    const cache = require('./cache.js');
+
    cache.registerCallback(onCacheResponse);
+
    console.log('cachelifesec=' + cachelifesec);
+
    cache.getCache(admin, id, cachelifesec);
+
    function onCacheResponse(cachedata) {
+
      response.send("cachedata=" + cachedata);
+
    }
+
});
+
</pre>
+
 
+
functions/cache.js
+
<pre>
+
/*
+
Cache設定例
+
    const cache = require('./cache.js');
+
    cache.registerCallback(onCacheResponse);
+
    cache.setCache(admin, cachedata, id);
+
    const onCacheResponseSetCache = function(data) {
+
      return data; // hogehoge
+
    }
+
    console.log(cache.getResCallbackSetCache()); // hogehoge
+
Cache取得例
+
    const cache = require('./cache.js');
+
    cache.registerCallback(onCacheResponse);
+
    console.log('cachelifesec=' + cachelifesec);
+
    cache.getCache(admin, id, cachelifesec);
+
    const onCacheResponseGetCache = function(data) {
+
      response.send("data=" + data);
+
    }
+
    console.log(cache.getResCallbackGetCache()); // hogehoge
+
*/
+
 
+
var mCallbackSetCache;
+
var mResCallbackSetCache = "";
+
var mCallbackGetCache;
+
var mResCallbackGetCache = "";
+
exports.registerCallbackSetCache = function(callback) {
+
    mCallbackSetCache = callback;
+
}
+
exports.getResCallbackSetCache = function() {
+
    return mResCallbackSetCache;
+
}
+
exports.registerCallbackGetCache = function(callback) {
+
    mCallbackGetCache = callback;
+
}
+
exports.getResCallbackGetCache = function() {
+
    console.log("getResCallbackGetCache mResCallbackGetCache=" + mResCallbackGetCache);
+
    return mResCallbackGetCache;
+
}
+
exports.setCache = 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,
+
  };
+
  admin.firestore().collection('caches')
+
    .doc(id).set(cache)
+
    .then((snapshot) =>
+
  {
+
      if (mCallbackSetCache != null) {
+
        mResCallbackSetCache = mCallbackSetCache(data);
+
      }
+
  });
+
}
+
exports.getCache = function(admin, id, cachelifesec) {
+
    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);
+
  admin.firestore().collection('caches')
+
    .where('id', '==', id)
+
    .where('unixtime', '>', unixtimecachelifesec)
+
    .limit(1)
+
    .get()
+
    .then((snapshot) =>
+
  {
+
    var caches = snapshot.docs.map(x => x.data());
+
    for (let i = 0; i < caches.length; i++) {
+
      console.log("ret data=" + caches[i].data);
+
      if (mCallbackGetCache != null) {
+
        mResCallbackGetCache = mCallbackGetCache(caches[i].data);
+
        console.log("getCache ari mResCallbackGetCache=" + mResCallbackGetCache);
+
      }
+
      return;
+
    }
+
    if (mCallbackGetCache != null) {
+
      mResCallbackGetCache = mCallbackGetCache("");
+
      console.log("getCache nasi mResCallbackGetCache=" + mResCallbackGetCache);
+
    }
+
  });
+
}
+
</pre>
+
 
+
==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に格納される。
+

2019年8月19日 (月) 14:02時点における最新版

Gcp/Firebase/Firestore/cacheモジュール/基本

Gcp/Firebase/Firestore/cacheモジュール/async