Firebase функции - PullRequest
       6

Firebase функции

0 голосов
/ 27 марта 2019

Я создаю сайт как игру.Я хочу обновлять статистику пользователей (золото и т. Д.) Каждые 5 минут.Для этого я настраивал cronjob каждые 5 минут, без проблем.Однако, похоже, что функции firebase могут «зависать», хотя на их сайте они работают около 5 мс.

Я только что обнаружил, что «покупаю» только тогда, когда запускается cronjob (функция запускается), я вижу, что"золото", вероятно, не обновляется, оно устанавливается сразу после того, как я начал покупать.

  1. Является ли моя функция даже приемлемой?
  2. Где может быть зависание?Это потому, что я перебираю (сейчас 100) фальшивых пользователей?
  3. Если так, то почему бы firebase сказать, что на это уходит в основном 5 мс?
  4. Есть ли способ убедиться, еслиПользователь обновляет так же, как функция собирается обеспечить, чтобы функция обновляла последнее значение?
import * as functions from 'firebase-functions';

import * as admin from "firebase-admin";

import {UnitsDTO} from '../../ProjectXFrontend/src/ModelsDTO/Unit/unitsDTO';
import {CurrencyDTO} from '../../ProjectXFrontend/src/ModelsDTO/Currency/CurrencyDTO';

admin.initializeApp();

  export const test = functions.https.onRequest((reques , respon) => {
    admin.database().ref('/LastUpdated').set(
      admin.database.ServerValue.TIMESTAMP
    ).then().catch()
    return respon.send(reques.ip);
  });

  export const GetTime = functions.https.onRequest((request , response) => {
    return response.send({data: new Date()})
  });

  export const CalculateBasics = functions.https.onRequest((request , res) => {
    if (request.ip === '195.201.26.157') {
      CalculateBreeder();
      return res.send('ok');
     } else {
      res.statusCode = 400;
      return res.send(new Error('Bad request'))
    } 

  });

 export const CalculateIncome = functions.https.onRequest((request , res) => {
  if (request.ip === '195.201.26.157') {
    CalculateIncomePrivate();
    return res.send('ok');
  } else {
    res.statusCode = 400;
    return res.send(new Error('Bad request'))
  }
 });




 function CalculateIncomePrivate() {
  admin.database().ref('/users').once('value').then( snap => {
    snap.forEach( child => { 
      const user = child.key // uid
        admin.database().ref('users/' + user).once('value').then(snapUser => {
          const units = new UnitsDTO();
          const currency = new CurrencyDTO();
          if (snapUser.hasChild('Units')) { // in units
            units.worker = snapUser.child('Units').child('worker').val()
          } 
          if (snapUser.hasChild('currency/gold')) { // gold
            currency.goldDto = snapUser.child('currency/gold').val();
          }
          // calculate news
          currency.goldDto.amount += units.worker.amount * units.worker.currencyPerTick;

          // set the Income
          admin.database().ref('users/' + user + '/currency/gold').set(currency.goldDto).then().catch(error => {console.error(error)})
          // update time
          admin.database().ref('/status/LastIncome').set(
            admin.database.ServerValue.TIMESTAMP
          )
          .then(() => {
            // return res.send('ok');

          })
          .catch(error => {
            // res.statusCode = 500;
            // return res.send(error)

          });

      }).catch(error => {
        // res.statusCode = 500;
        // return res.send(error);
      }); 
    })
  }).catch(error => {
    // res.statusCode = 500;
    // return res.send(error);
  })
 }


Итак, ожидаемый результат, конечно, в том, что функция обновляет доход пользователя, что она и делает,однако кажется, что он "зависает" и не совсем корректно обновляется из-за того, что пользователь "покупает вещи" при запуске функций.

1 Ответ

1 голос
/ 27 марта 2019

Это проблема асинхронного или блокирующего.

CalculateIncomePrivate является асинхронным, поэтому выполнение кода переместится на следующую строку, возвращая

Так что измените вашу функцию на

function  CalculateIncomePrivate()
    return admin.database...

А затем назвал его так:

exports.CalculateIncome....
return CalculateIncomePrivate().then(function(){
    resp....
}).catch(function(error){
    resp.status(500).send(error);
});

Убедитесь, что возвращено любое связанное обещание.

Это должно помочь вам с обещаниями https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

И это с обещаниями функций Firebase https://www.youtube.com/playlist?list=PLl-K7zZEsYLkPZHe41m4jfAxUi0JjLgSM

...