Как обновить список пользователей в Firestore с помощью Firebase admin sdk? - PullRequest
0 голосов
/ 04 февраля 2019

Итак, я изучаю, как использовать Firebase Admin SDK, и я столкнулся с проблемой, которую я недостаточно понимаю, чтобы решить.По сути, я запросил свою базу данных и получил подмножество пользователей, которых я хотел бы обновить с тем же значением.Поэтому я сохранил идентификаторы каждого пользователя, которого я хочу обновить, в массиве, теперь я пытаюсь перебрать этот массив и обновить каждого пользователя.Но у меня возникла проблема с реализацией этой части, и это связано с тем фактом, что .update () возвращает обещание, и я не на 100% могу обработать это в цикле ...

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp()
exports.getAllUsers = functions.https.onRequest((request, response) => {
  const db = admin.firestore()
  const users = db.collection('users').where('role', '==', 'artist').get()
    .then(function (querySnapshot) {
      //const users = querySnapshot.data()
      const promises = []
      querySnapshot.forEach(function (doc){
        promises.push(doc)
      })
      return Promise.all(promises) //returning promises sends the resolved results to 
    })                             //to the next .then()
    .then(function (person){
      let results = []
      person.forEach(function(personSnap){
        //const data = personSnap.data()
        results.push(personSnap.id)
      })
      return results  // results is the array of ids to update
    })
    //This .then() is where I have trouble understanding how to update
    .then(function (ids){
      for(var i = 0; i<ids.length; i++){
        var artistsRef = db.collection('users').doc(ids[i]);

        artistsRef.update({ //Should not be a return statement. This fixed my problem. Otherwise it would update the first user in the array and then leave the for loop.
          'free_credits': '2'
        })
      }
      return 'finished'
    })
    .then(function(reply) {
      return response.send(reply)
    })
    .catch(function (error){
      response.send(error)
    })

})

Мне кажется, что я должен возвращать ArtistRef.update (), так как это обещание, но я думаю, что это приводит к неожиданным результатам.

Если я не возвращаю update (), ESLint выдает ошибку: «Each then () должен возвращать значение или throw»

1 Ответ

0 голосов
/ 05 февраля 2019

Вы возвращаетесь рано после окончательного обратного вызова then() до отправки ответа.Возможно, вам следует добавить еще один then() только для отправки результата после завершения всех окончательных обновлений.

...