Tengo un archivo dedicado a manejar las funciones de autenticación para mi aplicación React Native. Una de estas funciones getJWToken es una función asíncrona anónima que intenta obtener el token de usuario actual por los siguientes medios:
const auth = db.auth() // db === (Firebase.apps.length === 0 ? Firebase.initializeApp(config) : Firebase.app()) // the configuration of the Firebase DB occurs in a config file and db is exported. const getJWToken = async () => { auth.onAuthStateChanged(function(user) { if (user) { user.getIdToken() .then(function(idToken) { return idToken; }) .catch( (error) => { console.log("Cannot get User Token: ", error); } ) } }); } A través de console.log puedo ver que la función devuelve el token como se supone que debe hacerlo. Los problemas llegan cuando lo estoy usando en otra función asíncrona en otro archivo así:
Carpeta de servicio index.js
import * as Auth from './AuthServices' export {Auth}Aplicación.tsx
// App.tsx import {Auth} from './src/services' // The rest in inside an Async Function signOut: async () => { let token token = await Auth.getJWToken() console.log("token: ", token) // results in undefined } El token da como resultado undefined . No tengo forma de devolver el valor del token de la función de promesa. Intenté usar return on auth.onAuthStateChanged pero eso da como resultado que el token se evalúe a [Function Bound] . await on auth.onAuthStateChanged tampoco hace nada. Estoy realmente perplejo.
Tienes que regresar en dos lugares más como se muestra en el código. Por favor responda con esta modificación, envíenos c
const auth = db.auth() // db === (Firebase.apps.length === 0 ? Firebase.initializeApp(config) : Firebase.app()) // the configuration of the Firebase DB occurs in a config file and db is exported. const getJWToken = async () => { return auth.onAuthStateChanged(function(user) { if (user) { return user.getIdToken() .then(function(idToken) { return idToken; }) .catch( (error) => { console.log("Cannot get User Token: ", error); } ) } }); }Si bien ya no uso este fragmento de código, pude resolverlo así:
getJWToken export const getJWToken = async () => { let result; // await is needed here await auth.onAuthStateChanged(function(user) { if (user) { console.log("user") // save this promise to result result = user.getIdToken() .then(function(idToken) { return idToken; }) .catch( (error) => { console.log("Cannot get User Token: ", error); } ) } }); // return the user.getToken() promise return result