Узел JS - ответ Firestore get () никогда не вызывается - PullRequest
0 голосов
/ 12 июня 2019

Я настраиваю простой сервер с nodejs с подключением администратора Firestore, уже настраиваю соединение, но когда я вызываю

dbFB.collection('users').get()
.then((response) => {
})
.catch((err) => {
})

, вся функция выглядит так:

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);

        })

    });
}

Здесь я запускаю функцию userExist =>

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();

                })
        });
    }
}

Я никогда не получаю ответ ни в Then, ни в Catch, уже проверяю, что приложение firebase инициализировано со всеми параметрами, так что понятия не имею, что здесь может быть не так.

Что-то странное в том, что при использовании проекта Firebase появляется количество вызовов чтения, требуется время, чтобы появиться, но оно появляется ..

есть идеи?

Ответы [ 3 ]

1 голос
/ 12 июня 2019

Я бы изменил это, как говорили другие, чтобы оно было асинхронным, а не полагалось на обещания.Дайте что-то вроде этого:

async function userExist(name) {
    try 
    {
        const dbFB = initializeApp(); // this should probably get moved outside
        const collectionRef = await dbFB.collection('users').get();
        if (collectionRef && collectionRef.length > 0) {
            collectionRef.forEach((docRef) => {
                console.log(docRef.id, '=>', docRef.data());
                if (name == doc.data().name) {
                   console.log('foreach');
                   return doc.data().idFB;
                }
            });
        }
    } catch (error: any) {
        console.log('Error getting documents', err);
    }
}
1 голос
/ 12 июня 2019

это должно сработать

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);

        })

    });
}

Затем вы реализуете это следующим образом (например):

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

})()

НО, НО ... так как у вас есть имя, выВам не нужно запрашивать всю коллекцию, как вы делаете ... так что, может быть, что-то подобное может работать лучше ...

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);

        })

    });
}

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

Я понял, на самом деле, это была ошибка новичка, узел js устарел, я обновил его и Firebase начала работать отлично,

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