Tengo una función en la nube implementada en Firebase, y mis aplicaciones de iOS y Android la usan bien, todo funciona bien. A continuación se muestra la función desplegada.
const admin = require('firebase-admin'); const firebase_tools = require('firebase-tools'); const functions = require('firebase-functions'); admin.initializeApp(); exports.deleteUser = functions .runWith({ timeoutSeconds: 540, memory: '2GB' }) .https.onCall((data, context) => { const userId = context.auth.uid; var promises = []; // DELETE DATA var paths = ['users/' + userId, 'messages/' + userId, 'chat/' + userId, 'like/' + userId]; paths.forEach((path) => { promises.push( recursiveDelete(path).then( () => { return 'success'; } ).catch( (error) => { console.log('Error deleting user data: ', error); }) ); }); // DELETE FILES const bucket = admin.storage().bucket(); var image_paths = ["avatar/" + userId, "avatar2/" + userId, "avatar3/" + userId]; image_paths.forEach((path) => { promises.push( bucket.file(path).delete().then( () => { return 'success'; } ).catch( (error) => { console.log('Error deleting user data: ', error); }) ); }); // DELETE USER promises.push( admin.auth().deleteUser(userId) .then( () => { console.log('Successfully deleted user'); return true; }) .catch((error) => { console.log('Error deleting user:', error); }) ); return Promise.all(promises).then(() => { return true; }).catch(er => { console.error('...', er); }); }); function recursiveDelete(path, context) { return firebase_tools.firestore .delete(path, { project: process.env.GCLOUD_PROJECT, recursive: true, yes: true, token: functions.config().fb.token }) .then(() => { return { path: path } }).catch( (error) => { console.log('error: ', error); return error; }); } // [END recursive_delete_function] ¿Cómo puedo ejecutar este script con un button en javascript? ¿Un archivo .js estándar localmente? También necesito poder pasar un ID de usuario manualmente.
En mi aplicación nativa de reacción, lo llamo así:
const deleteUser = async () => { functions().httpsCallable('deleteUser')() signOut(); }Pero en mi archivo javascript (nada que ver con mi aplicación nativa de reacción), necesito pasar un ID de usuario y llamar a esa misma función para eliminar al usuario.
Hay varias formas de ejecutar una función en la nube dentro de la aplicación del lado del cliente.
Dependiendo de cómo haya configurado la función, puede pasar un parámetro o datos a través del cuerpo de la solicitud.
Por ejemplo, usando express (similar a otros marcos):
// fetch('api.com/user/foo', {method: 'DELETE'} ) app.delete('/user/:uid', (req, res) => { const uid = req.params.uid; // execute function }) // fetch('api.com/user', {method: 'DELETE', body: { uid: foo } } ) app.delete('/user', (req, res) => { const uid = req.body.uid; // execute function }) // fetch('api.com/user?uid=foo', {method: 'DELETE'} ) app.delete('/user', (req, res) => { const uid = req.query.uid; // execute function })Ejemplo completo:
<button onclick=“deleteUser(uid)”>Delete Me</button> <script> function deleteUser(uid) { fetch(`api.com/user/${uid}`, { method: 'DELETE'}); // rest of function } </script>Pude llamar a mi función firebase con lo siguiente:
userId era accesible así const { userId } = data; de mi script de función
async function deleteAccount(userId) { const deleteUser = firebase.functions().httpsCallable("deleteUser"); deleteUser({ userId }).then((result) => { console.log(result.data); }); }