Как работать с обещанием с firestore + pdfmake в Firebase Functions - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь сделать PDF-файл, получая данные из firestore, используя функции firebase, но теперь у меня проблема.У меня есть такая структура данных:

  • Коллекция
    • Документ
      • Поле 1
      • Поле 2
      • Другая коллекция
        • Документ
          • Поле 2 ...
        • Документ 2 ...
    • Документ2 ...

Мне нужно конвертировать это struture в json, чтобы показать на pdfMake.Я знаю, что должен использовать обещания, но конечный объект не выглядит так, как я ожидал.Когда я использую первый слой (только поле из первых документов), он работает нормально, но когда я пытаюсь зайти в ту же коллекцию документов, я получаю сообщение об ошибке.Я поставлю код ниже.

Ошибка в том, что мой «второй затем» возврат до того, как первый «потом» будет разрешен, поэтому мой файл PDF отображает пустой файл на экране.Это не показывает никакой ошибки, но на консоли я вижу, что данные выбираются после того, как ответ будет возвращен.Мне нужно разрешить первые, затем включенные в цикл перед отправкой любого ответа, но это не происходит

exports.helloPDF = functions.https.onRequest( (request, response) => {
try {
    db.collection('lista_substituicao').get().then((lista_substituicao) =>{
        let docDefinition = { //definitions will be used on pdf file
            background: function () {
                return [
                    {
                    image: 'bg.jpg',
                    width: 550
                }
            ];
        },
        content: []
    };

    lista_substituicao.forEach( grupo => {
        let grupoDef = {id: grupo.id, ...grupo.data()}
        let tabelaGrupo = {
            table: {
                widths: ['*'],
                body: [
                    [`Grupo ${grupoDef.grupo}`]
                ]
            }
        } 

        db.collection(`lista_substituicao/${grupoDef.id}/alimentos/`).get().then(alimentos =>{
            let alimentosTable = {
                table: {
                    widths: ['*'],
                    body: [
                        ["Alimento"]
                    ]
                }
            }
            alimentos.forEach(alimentoDef =>{
                let alimento = {id: alimentoDef.id, ...alimentoDef.data()}
                alimentosTable['table']['body'].push([alimento.alimento])                    
            })

            tabelaGrupo['table']['body'].push(alimentosTable)
            docDefinition['content'].push(tabelaGrupo)
        })
    })

    return docDefinition

}).then((finalDocDefinition) =>{
    console.log(finalDocDefinition) // i get undefined here
    let doc = printer.createPdfKitDocument(docDefinition);
                response.setHeader('Content-Type', 'application/pdf');
                doc.end();
                return doc.pipe(response)
})


 } catch (error) {
    console.log(error)
}

})

1 Ответ

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

Я изменил код, и теперь он работает, как и ожидалось.

Я сделал другие функции, которые возвращают дерево json, как я хотел.Код:

 db.collection(`lista_substituicao`).get().then(lista_substituicao =>{
    let grupos = []
    let grupoPromisses = []

    lista_substituicao.forEach(grupo => {
        let grupoData = {id: grupo.id, ...grupo.data(), alimentos: []}
        let promise = db.collection(`lista_substituicao/${grupo.id}/alimentos/`).get()
        grupoPromisses.push(promise)
        grupos[grupo.id] = grupoData
    })

    Promise.all(grupoPromisses).then(alimentos => {
        alimentos.forEach(alimentos =>{
            alimentos.forEach(alimento =>{
                let idGrupo = alimento.ref.parent.parent.id
                grupos[idGrupo]['alimentos'].push(alimento.data())
            })
        })
        return response.status(201).json({...grupos});
    })
})
...