0
votes

Node JS - La réponse Firestore get () n'est jamais appelée

Je mets en place un serveur simple avec nodejs avec une connexion admin Firestore, j'ai déjà configuré la connexion, mais quand j'appelle

const self = module.exports = {
    configureUsers: function (name) {
        return new Promise( (resolve, reject) => {

            console.log(`Name: ${name}`);

            const userResponse = userExist(name);
            userResponse.then((user) => {

                    console.log('Begin promise USEREXIST');

                    if (user != "") {

                        console.log(`idFB: ${user}`);

                        let users = [];

                        // wipe users
                        db.set('users', {}).write();

                        users.push(user);

                        db.set(`users[${user}]`, {
                            keyFilePath: path.resolve(__dirname, `configurations/secrets/omni.json`),
                            savedTokensPath: path.resolve(__dirname, `configurations/tokens/${user}.json`)
                        }).write()

                        resolve(db.getState())

                        console.log("User exists");

                        rl.close();
                    }
                    reject('User does not exists');
                    rl.close();

                })
                .catch((err) => {

                    console.log("Closing Catch");
                    reject(err);
                    rl.close();

                })
        });
    }
}

toute la fonction ressemble à ceci:

XXX

Ici, je déclenche la fonction userExist =>

function userExist(name) {

    return new Promise((resolve, reject) => {

        var dbFB = initializeApp();

        var result = dbFB.collection('users').get().then((response) => {

            var snap = response.docs;
            console.log('snap', snap);

            if (!snap.empty) {
                snap.forEach((doc) => {

                    console.log(doc.id, '=>', doc.data());

                    if (name == doc.data().name) {
                        console.log('foreach');
                        resolve(doc.data().idFB);
                    }

                });
            }

            reject("User does no exist");

        })
        .catch((err) => {

            console.log('Error getting documents', err);
            reject(err);

        })

    });
}

Je ne reçois jamais de réponse ni dans Then ni Catch, vérifiez déjà que l'application Firebase est initialisé, avec tous les paramètres donc aucune idée de ce qui pourrait ne pas aller ici.

Quelque chose de bizarre est que dans l'utilisation du projet Firebase apparaît le nombre d'appels de lecture, cela prend un certain temps à apparaître, mais cela apparaît ..

des idées?


4 commentaires

La fonction elle-même n'a-t-elle pas besoin d'être asynchrone? fonction asynchrone userExist ... . Aussi ... avez-vous pensé à utiliser async await pour rendre les choses asynchrones beaucoup plus faciles à gérer (et à lire). :RÉ


@Fogmeister avec la promesse? ou utiliser async au lieu de Promise return?


Hmm ... TBH Je ne suis pas tout à fait sûr. Nous utilisons async wait partout, donc nous ne sommes pas tout à fait sûrs du processus exact avec Promises. Quel est le déclencheur de cette fonction?


@Fogmeister donnez-lui un coup d'oeil, ajoutez simplement la fonction de déclenchement


3 Réponses :


1
votes

cela devrait faire l'affaire

const userExist = async (name) => {

    return new Promise((resolve, reject) => {

        var dbFB = initializeApp();

        var result = dbFB.collection('users')
                     .where(`name`, `==`, name) // <-- here
                     .get().then((response) => {

            var snap = response.docs;
            console.log('snap', snap);

            if (!snap.empty) {
                snap.forEach((doc) => {

                    console.log(doc.id, '=>', doc.data());

                    if (name == doc.data().name) {
                        console.log('foreach');
                        resolve(doc.data().idFB);
                    }

                });
            }

            reject("User does no exist");

        })
        .catch((err) => {

            console.log('Error getting documents', err);
            reject(err);

        })

    });
}

Ensuite, vous l'implémentez comme ceci (par exemple):

(async () => {
   const data = await userExist(WHATEVER)

})()

MAIS MAIS MAIS .. . puisque vous avez le nom, vous n'avez pas besoin d'interroger toute la collection comme vous le faites ... donc quelque chose comme ça pourrait peut-être mieux fonctionner ...

const userExist = async (name) => {

    return new Promise((resolve, reject) => {

        var dbFB = initializeApp();

        var result = dbFB.collection('users').get().then((response) => {

            var snap = response.docs;
            console.log('snap', snap);

            if (!snap.empty) {
                snap.forEach((doc) => {

                    console.log(doc.id, '=>', doc.data());

                    if (name == doc.data().name) {
                        console.log('foreach');
                        resolve(doc.data().idFB);
                    }

                });
            }

            reject("User does no exist");

        })
        .catch((err) => {

            console.log('Error getting documents', err);
            reject(err);

        })

    });
}


1 commentaires

excellente approche mais malheureusement le même résultat: (il reste dans dbFB.collection ('users'). get (); il ne fait rien après avoir appelé get (), il meurt simplement là, il n'entre pas alors ou n'attrape pas



1
votes

Je le modifierais, car d'autres l'ont dit, d'être asynchronisé plutôt que de compter sur des promesses. Donnez quelque chose comme celui-ci un coup: xxx


1 commentaires

Même résultat :( Ça blut dans dbfb.collection ("utilisateurs"). Obtenez (); ça ne fait rien après avoir appelé get (), il meurt simplement là-bas



0
votes

J'ai compris que c'était une erreur de débutant, le node js était obsolète, je l'ai mis à jour et Firebase a commencé à fonctionner parfaitement,


0 commentaires