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?
3 Réponses :
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); }) }); }
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
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:
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
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,
La fonction elle-même n'a-t-elle pas besoin d'être asynchrone?
fonction asynchrone userExist ...
. Aussi ... avez-vous pensé à utiliserasync 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