Проблема с обещанием в функциях Firebase - PullRequest
0 голосов
/ 12 июня 2019

Этот код запускается один раз или максимум 100 раз. У меня есть фиктивный файл данных с 6000 записями, поскольку это среднее значение, которое он должен обработать.

В настоящее время используется план Blaze.

Код работал несколько, я создал новый проект, и теперь я получаю эту проблему.

    export const uploadPatrons = functions.storage
      .object()
      .onFinalize((object, context) => {
    let patronPromise: any[];
    patronPromise = [];
    if (object.name === 'patrons/upload.csv') {
      admin
        .storage()
        .bucket()
        .file('/patrons/upload.csv')
        .download({})
        .then(data => {
          Papa.parse(data.toString(), {
            header: true,
            skipEmptyLines: true,
            complete: result => {
              result.data.forEach(x => {
                x.inside = false;
                x.arrived = false;
                x.img = false;
                x.arrivedTime = null;

                const newPromise = admin
                  .firestore()
                  .collection('patrons')
                  .add({ ...x })
                  .then(doc => {
                    console.log(doc);
                  })
                  .catch(err => {
                    console.log(err);
                  });

                patronPromise.push(newPromise);
              });
            }
          });
        })
        .catch(err => {
          console.log(err);
        });
    }
    return Promise.all(patronPromise)
    .catch(err => {
      console.log(err);
    });
  });

Все, что нужно сделать, это прочитать файл из хранилища, проанализировать его и добавить каждую запись в коллекцию Firebase

Функция вернула неопределенное, ожидаемое обещание или значение

Это ошибка, которую я получаю в логах

Ответы [ 2 ]

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

Из-за вашего первого обещания может быть отключено, даже если оно не закончено.Поэтому постарайтесь следовать правилу promise/always-return

export const uploadPatrons = functions.storage
.object()
.onFinalize((object, context) => {
    if (object.name === 'patrons/upload.csv') {
        return admin.storage().bucket()
            .file('/patrons/upload.csv')
            .download({})
            .then(data => {
                let patronPromise: any[];
                patronPromise = [];
                Papa.parse(data.toString(), {
                    header: true,
                    skipEmptyLines: true,
                    complete: result => {
                        result.data.forEach(x => {
                            x.inside = false;
                            x.arrived = false;
                            x.img = false;
                            x.arrivedTime = null;

                            const newPromise = admin.firestore()
                                .collection('patrons')
                                .add({
                                    ...x
                                })

                            patronPromise.push(newPromise);
                        });

                    }
                });
                return Promise.all(patronPromise)
            })
            .then(result=>{
                //return Promise.resolve or something
            })
            .catch(err=>{
                console.log(err)
            })
    }
    else{
        //also return if it's nothing
    }
});
0 голосов
/ 12 июня 2019

Вы игнорируете обещание, которое возвращает admin.storage().bucket().file('/patrons/upload.csv').download({}), что означает, что функция может быть прервана.

Я думаю, что это должно быть ближе к этому:

export const uploadPatrons = functions.storage
.object()
.onFinalize((object, context) => {
    let patronPromise: any[];
    patronPromise = [];
    if (object.name === 'patrons/upload.csv') {
        return admin.storage().bucket()
            .file('/patrons/upload.csv')
            .download({})
            .then(data => {
                Papa.parse(data.toString(), {
                    header: true,
                    skipEmptyLines: true,
                    complete: result => {
                        result.data.forEach(x => {
                            x.inside = false;
                            x.arrived = false;
                            x.img = false;
                            x.arrivedTime = null;

                            const newPromise = admin.firestore()
                                .collection('patrons')
                                .add({
                                    ...x
                                })

                            patronPromise.push(newPromise);
                        });
                        // TODO: return the Promise.all(patronPromise) here
                    }
                });
            })
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...