Firebase功能无法解决问题

时间:2019-06-12 10:20:26

标签: node.js angular firebase google-cloud-functions

此代码运行一次或最多运行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 :(得分:0)

您忽略了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
                    }
                });
            })
    }
});

答案 1 :(得分:0)

因为您的第一个诺言可能会关闭,即使尚未完成。因此,请尝试遵循规则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
    }
});