Массив облачных функций Pubsub - PullRequest
0 голосов
/ 06 сентября 2018

новые функции облака Google.
Я разрабатываю сборщик данных с датчиков. Те сенсор толкают информацию на пабе. Затем я разработал триггер pubsub, который берет данные из pubsub и ведет их через пожарный магазин в режиме реального времени. Моя проблема в том, что данные, поступающие с датчика, всегда разные, а структура сына для обновления одинакова. Я могу выполнять обновление в реальном времени по фиксированной структуре (например, обновляется массив сыновей из 4 элементов), но мне бы хотелось, чтобы моя функция считывала то, что находится в pubsub, и обновляла только относительный элемент в firestore. Например, датчик отправляет сообщение со статусом: Вкл. Прибытие на pubsub, моя функция должна обновлять только переменную состояния. Я думаю, что для создания массива, каждый раз отличающегося друг от друга, следует использовать цикл foreach над полезной нагрузкой, но я не могу найти ни одного примера.

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
const db = admin.firestore();

/**
 * Receive data from pubsub, then
 * Maintain last device data on Firestore 'devices' collections then
 * Write telemetry raw data to 'devices/location_logs' subcollection
 */
 exports.receiveTelemetry = functions.pubsub
.topic('telemetry-topic')
.onPublish((message, context) => {
 const attributes = message.attributes;
 const payload = message.json;
 const deviceId = attributes['deviceId'];

 const data = {
  deviceId: deviceId,
  timestamp: new Date(context.timestamp),
  deviceUptime: payload.Uptime,
  deviceWifiSignal: payload.Sig
};

let deviceRef = db.collection('devices').doc(deviceId);

return deviceRef.get().then(doc => {
  if (!doc.exists) {
    data.state = 'MOVING';
    return Promise.all([
      updateCurrentDataFirestore(deviceRef, data),
      insertLocationLog(deviceRef, data)
    ]).then(() => {
      return updateDeviceDateIndex(deviceRef, data, {});
    });
  }

  let device = doc.data();


    return updateCurrentDataFirestore(deviceRef, data);

 });
 });


 /**
  * Maintain last status in Firestore
  */
 function updateCurrentDataFirestore(deviceRef, data) {

 return deviceRef.set(
 {

  deviceWifiSignal: data.deviceWifiSignal,
  deviceUptime: data.deviceUptime  
 },
 { merge: true }
 );  
 }



/**
 * Update device date index with all days that have data
 */
function updateDeviceDateIndex(deviceRef, data, dateIndex) {
const key = data.timestamp.toJSON().substring(0, 10);
const count = dateIndex[key];
if (!count) {
dateIndex[key] = 1;
} else {
dateIndex[key] = count + 1;
}
return deviceRef.update({
dateIndex
});
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...