Облачная функция Firebase не обновляет данные - PullRequest
0 голосов
/ 05 июня 2019

У меня есть база данных Firebase в реальном времени, которая имеет пользовательский узел и содержит много пользователей. Я хочу установить для свойства rating пользователя значение 0, для этого сначала мне нужно прочитать базу данных и обновить базу данных.

моя функция читает данные, но не может обновить и вернуть {} в браузере

exports.quarter = functions.https.onRequest((req, res) => {
 let user1 = admin.database().ref('users/user1/userDetails').once('value');
 let user2 = admin.database().ref('users/user2/userDetails').once('value');
 let user3 = admin.database().ref('users/user3/userDetails').once('value');
 let user4 = admin.database().ref('users/user4/userDetails').once('value');
  Promise.all([user1, user2, user3, user4])
      .then(result => {
    let data = {};
     result[0].forEach(action => {
         data['users/user1/userDetails/' + action.key + '/' + 'Rating'] = 0;
     });
     result[1].forEach(action => {
         data['users/user2/userDetails/' + action.key + '/' + 'Rating'] = 0;
     });
    result[2].forEach(action => {
        data['users/user3/userDetails/' + action.key + '/' + 'Rating'] = 0;
    });
    result[3].forEach(action => {
        data['users/user4/userDetails/' + action.key + '/' + 'Rating'] = 0;
    });
     return data;

}).then(data => {
      console.log(data);
     return  admin.database().ref().update(data);

 }).then(data => {
     return res.send('done');

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

Я вижу результат console.log(data), но функция не обновляется и, наконец, после выполнения запроса getон возвращает {}.

что с этим не так?

Ответы [ 3 ]

0 голосов
/ 05 июня 2019

Promise.all() возвращается до того, как любое из переданных ему обещаний закончится. Это означает, что data будет пустым объектом с оригинальным определением, и это значение будет возвращено немедленно. Вместо этого у вас должен быть следующий then обработчик обратного вызова для каждого результата:

exports.quarter = functions.https.onRequest((req, res) => {
 let user1 = admin.database().ref('users/user1/userDetails').once('value');
 let user2 = admin.database().ref('users/user2/userDetails').once('value');
 let user3 = admin.database().ref('users/user3/userDetails').once('value');
 let user4 = admin.database().ref('users/user4/userDetails').once('value');
 return Promise.all([user1, user2, user3, user4]);
}).then(data => {
  // data will be an array of all the results. Handle them here.
 })
});
0 голосов
/ 05 июня 2019

Следующее должно сделать трюк:

exports.quarter = functions.https.onRequest((req, res) => {
  let user1 = admin
    .database()
    .ref('users/user1/userDetails')
    .once('value');
  let user2 = admin
    .database()
    .ref('users/user2/userDetails')
    .once('value');
  let user3 = admin
    .database()
    .ref('users/user3/userDetails')
    .once('value');
  let user4 = admin
    .database()
    .ref('users/user4/userDetails')
    .once('value');

  Promise.all([user1, user2, user3, user4])
    .then(result => {
      let data = {};
      result[0].forEach(action => {
        data['users/user1/userDetails/' + action.key + '/' + 'Rating'] = 0;
      });
      result[1].forEach(action => {
        data['users/user2/userDetails/' + action.key + '/' + 'Rating'] = 0;
      });
      result[2].forEach(action => {
        data['users/user3/userDetails/' + action.key + '/' + 'Rating'] = 0;
      });
      result[3].forEach(action => {
        data['users/user4/userDetails/' + action.key + '/' + 'Rating'] = 0;
      });
      console.log(data);
      return admin
        .database()
        .ref()
        .update(data);
    })
    .then(() => {
      return res.send('done');
    })
    .catch(error => {
      return res.status(500).send(error);
    });
});
0 голосов
/ 05 июня 2019

эта строка admin.database().ref().update(data) ваша ссылка кажется undefined, взгляните на документы

Я не уверен, что вы имеете в виду что-то вроде сохранения ссылки, которую вы определилинаверху

 let user1 = admin.database().ref('users/user1/userDetails').once('value');

если это так .. вам нужно что-то вроде

 let user1 = admin.database().ref('users/user1/userDetails');
  user1.once('value')

 // and down where you want to update
 user1.update.(data)

Но обратите внимание, что это только данные для этого узла, вы не можете обновить их всесразу, если вы хотите использовать свой подход

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