Как я могу написать запланированную функцию в TypeScript для сброса userHighScore для всех пользователей в моей базе данных Firebase Realtime? - PullRequest
0 голосов
/ 19 мая 2019

У меня есть игра для iOS / swift с таблицей лидеров, и я хотел бы, чтобы все баллы сбрасывались до 0 каждый понедельник в 12:00 утра.код в моем index.ts, который будет запускаться каждый понедельник в 12:00, но я не уверен, как написать код в TypeScript, чтобы обновить все userHighScores до 0.

Вот что у меня есть в индексе.ts:

import * as functions from 'firebase-functions';

functions.pubsub.schedule(‘0 0 * * 1’).onRun((context) => {


    // This code should set userHighScore to 0 for all users, but isn't working 

    .ref('/users/{user.user.uid}/').set({userHighScore: 0});


console.log(‘This code will run every Monday at 12:00 AM UTC’); 
});

После сохранения приведенного выше кода и запуска «развертывания firebase» в Терминале я вижу эту ошибку:

Found 23 errors.

npm ERR! code ELIFECYCLE
npm ERR! errno 2
npm ERR! functions@ build: `tsc`
npm ERR! Exit status 2
npm ERR! 
npm ERR! Failed at the functions@ build script.
npm ERR! This is probably not a problem with npm. There is likely 
additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/derencewalk/.npm/_logs/2019-05-19T00_39_38_037Z-debug.log

Error: functions predeploy error: Command terminated with non-zero exit code2

При запуске firebase не возникает никаких ошибокразверните только код console.log, так что я уверен, что строка кода .ref неверна.Какой будет правильный синтаксис?

Заранее спасибо за любую помощь.

Обновление

Вот рабочий кодкоторый обновляет все userHighScores для всех пользователей в базе данных один раз в неделю в понедельник в 12:00:

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
admin.initializeApp();

export const updateHighScores = functions.pubsub.schedule('0 0 * * 1').onRun((context) => {

//console.log(‘This code will run every Monday at 12:00 AM UTC’);
const db = admin.database();
return db
  .ref('users')
  .once('value')
  .then(snapshot => {
    const updates:any = {};
    snapshot.forEach((childSnapshot:any) => {
      const childKey = childSnapshot.key;
      updates['users/' + childKey + '/userHighScore'] = 0;
      updates['users/' + childKey + '/earnedExtraTime'] = 0;
    });
    return db.ref().update(updates);
  });
});

1 Ответ

1 голос
/ 19 мая 2019

В вашем коде есть несколько проблем.

Во-первых, ref() - это метод Reference в Admin SDK для Node.js (который является SDKдля использования в облачной функции, если вы хотите взаимодействовать с базой данных реального времени).Поэтому вам нужно сделать что-то вроде admin.database().ref(...).set({userHighScore: 0});

Во-вторых, объявление Reference с '/users/{user.user.uid}/' не будет работать, так как вам нужно передать строку или существующую ссылку на метод ref()(или вообще ничего, в этом случае он будет указывать на корень базы данных).См. https://firebase.google.com/docs/reference/admin/node/admin.database.Database#ref.

В-третьих, если вы хотите изменить все дочерние узлы в узле users, вам сначала нужно запросить их с помощью метода once(), а затем записать новое значение для каждогоиз них с помощью методов set() или update().

Я предполагаю, что ваша структура базы данных выглядит следующим образом:

databaseRoot
    - users
        - user1_uid
            - userName: "xyz"
            - userHighScore: 66
            - otherDataElement: ....
        - user2_uid
            - userName: "abcd"
            - userHighScore: 32
            - otherDataElement: ....

Поэтому я предлагаю изменить ваш код следующим образом:

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
admin.initializeApp();


export const updateHighScores = functions.pubsub.schedule(‘0 0 * * 1’).onRun((context) => {

    // This code should set userHighScore to 0 for all users, but isn't working
    //console.log(‘This code will run every Monday at 12:00 AM UTC’);
    const db = admin.database();
    return db
      .ref('users')
      .once('value')
      .then(snapshot => {
        const updates = {};
        snapshot.forEach(childSnapshot => {
          const childKey = childSnapshot.key;
          updates['users/' + childKey + '/userHighScore'] = 0;
        });
        return db.ref().update(updates);
      });
});

Обратите внимание, что мы добавляем Admin SDK (см. https://firebase.google.com/docs/admin/setup#add_the_sdk) и инициализируем его (см. https://firebase.google.com/docs/admin/setup#initialize_without_parameters)

).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...