Получить данные из сложного запроса в FireStore с помощью облачной функции? - PullRequest
0 голосов
/ 29 апреля 2020

Сначала я ищу указанный документ c с документом. В этой функции я использую разные фильтры для получения указанных c значений из данных. Результатом этих фильтров является массив, который будет использовать его как «foreach». Результат объединяется в elementosaux, а следующий равен elementos. Проблема в том, что я печатаю o, получаю значение elementos, в результате получаем undefined

Это код. Спасибо за вашу помощь.

exports.autentifyday = functions.https.onRequest((req, res) => {
    cors(req, res, () => {
        var db = admin.firestore();
        const key=req.query.key;
        const dia=req.query.dia;
         db.collection("/servicios_disponibles/").doc(key).get().then(function(doc){
            var Ddr;
            var Str;
            var horario;
            var horas;
            var horasaux;
            var horasselected;
            var elementos: any[] = [];
            var elementosaux: any[] = [];
            var elementoselement;
            if( doc.exists){
                var diaselected;
                Ddr = JSON.parse(JSON.stringify(doc.data()));
                horario=Ddr.horario;
                horario.filter((dias: { dia: any; disponibilidad: boolean; })=>{
                    if(dias.dia==dia){
                        if(dias.disponibilidad==true){
                            diaselected=dias; 
                        }
                    }
                });
                horas=JSON.parse(JSON.stringify(diaselected));
                horasaux=horas.horas;
                horasselected=horasaux.filter((hora: { disponibilidad: boolean; })=>hora.disponibilidad==true);
                horasselected.forEach(function(hora: { hora: any; }){
                    db.collection("pedidos_servicios").where("key","==",key)
                    .where("horas","array-contains",hora.hora).get().then(snapshot=>{
                        snapshot.forEach(doc3=>{
                           elementoselement = {
                                "horas": doc3.data().horas
                            }
                            elementosaux = elementosaux.concat(elementoselement);
                            console.log(elementosaux)//return an array with the answer query
                        });
                        elementos=[];
                        elementos=elementosaux;
                        console.log(elementos)//is undefined in this point
                    }).catch((e)=>console.log(e))            
                })
                }
            console.log(elementosaux)//is undefined in this point
            res.send(Str);
            return Str;
         }).catch(reason => {
            res.send(reason);
            console.log(reason);
            return reason;
        });
    });
});

1 Ответ

0 голосов
/ 01 мая 2020

Это может быть метра асинхронного кода. Я взял часть вашего кода и создал простой пример:

const db = new Firestore()

var elementos: any[] = [];
var elementosaux: any[] = [];
var elementoselement;

let colRef = db.collection("collection1");

if (true) {
    console.log("start")
    colRef.get().then((snapshot) => {
        snapshot.forEach(doc3=>{
            elementoselement = {
            "horas": doc3.data().horas
            }
            console.log("elementoselement",elementoselement)
            elementosaux = elementosaux.concat(elementoselement);
            console.log("elementosaux inside snapshot", elementosaux)//return an array with the answer query
        });
        elementos=[];
        elementos=elementosaux;
        console.log("elementos inside snapshot", elementos)//is undefined in this point
        });
    console.log("elementosaux outside snapshot", elementosaux)
    console.log("elementos outside snapshot", elementos)
}
console.log("elementosaux outside if", elementosaux)//is undefined in this point
console.log("end")

Я добавил в свою коллекцию пожарного магазина collection1 с одним документом, содержащим поле horas: horas_value - чтобы он работал.

Пример содержит больше информации журнала о том, какой частью кода является конкретный журнал. Когда вы запускаете его как ts-node test_main.ts, вы получаете следующий результат:

start
elementosaux outside snapshot []
elementos outside snapshot []
elementosaux outside if []
end
elementoselement { horas: 'horas_value' }
elementosaux inside snapshot [ { horas: 'horas_value' } ]
elementos inside snapshot [ { horas: 'horas_value' } ]

Поскольку get является асинхронным, вы можете видеть, что журналы внутри него находятся в конце. Есть много возможностей с этим справиться. Например, вы можете поместить целую if в функцию 'asyn c' и добавить 'await', чтобы получить:

async function main()  {
    if (true) {
        ....
        await colRef.get().then((snapshot) => {
        ....
}
main()

, а затем результат:

start
elementoselement { horas: 'horas_value' }
elementosaux inside snapshot [ { horas: 'horas_value' } ]
elementos inside snapshot [ { horas: 'horas_value' } ]
elementosaux outside snapshot [ { horas: 'horas_value' } ]
elementos outside snapshot [ { horas: 'horas_value' } ]
elementosaux outside if [ { horas: 'horas_value' } ]
end

Только я не знаю, почему вы говорите, что это undefined, это не должно быть ... У меня есть пустые массивы ... Может быть, это вопрос способа запуска кода.

Я надеюсь, что это будет помощь!

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