Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

528
Views
Firebase Auth: dirección de correo electrónico no válida que bloquea la aplicación node.js (Express)

Tengo un problema extraño aquí. Código sencillo:

 router.post("/resetpassword/:email", async (req, res) => { try { var auth = firebase.auth(); await auth.sendPasswordResetEmail(req.params.email); res.sendStatus(200); } catch (e) { console.log(e); res.sendStatus(400); } });

Este código funciona bien si

  • El correo electrónico es válido y conocido.
  • El correo electrónico es desconocido (recibo una excepción con un código de estado que puedo manejar)

Pero si el correo electrónico tiene un formato incorrecto, también obtengo una excepción con el código de estado, pero luego mi aplicación Express falla después de haber invocado el bloque catch. El HTTP 400 se envía al cliente, pero después de eso, mi aplicación está muerta.

Aquí está la salida de la consola. El primer bloque es para una dirección de correo electrónico desconocida, el segundo para una con formato incorrecto.

 { [Error: There is no user record corresponding to this identifier. The user may have been deleted.] code: 'auth/user-not-found', message: 'There is no user record corresponding to this identifier. The user may have been deleted.' } { [Error: The email address is badly formatted.] code: 'auth/invalid-email', message: 'The email address is badly formatted.' } [...]\node_modules\firebase\auth-node.js:39 h.send=function(a){if(a)if("string"==typeof a)this.sa.send(a);else throw Error("Only string data is supported");else this.sa.send()};h.abort=function(){this.sa.abort()};h.setRequestHeader=function(){};h.He=function(){this.status=200;this.responseText=this.sa.responseText;Ic(this,4)};h.Jd=function(){this.status=500;this.responseText="";Ic(this,4)};h.Je=function(){this.Jd()};h.Ie=function(){this.status=200;Ic(this,1)};var Ic=function(a,b){a.readyState=b;if(a.onreadystatechange)a.onreadystatechange()};var Jc=function(a,b,c){this.Ue=c;this.we=a;this.kf=b;this.oc=0;this.gc=null};Jc.prototype.get=function(){var a;0<this.oc?(this.oc--,a=this.gc,this.gc=a.next,a.next=null):a=this.we();return a};Jc.prototype.put=function(a){this.kf(a);this.oc<this.Ue&&(this.oc++,a.next=this.gc,this.gc=a)};var Kc=function(a){l.setTimeout(function(){throw a;},0)},Lc,Mc=function(){var a=l.MessageChannel;"undefined"===typeof a&&"undefined"!==ty Error: The email address is badly formatted. [nodemon] app crashed - waiting for file changes before starting...

Actualmente asumo que esto es un error estúpido de mi parte (soy bastante nuevo en Node/Express). ¿Alguna idea de lo que me estoy perdiendo aquí?

about 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Me encontré con este error mientras trabajaba con firebase.auth() , y es muy peculiar. Lo que pensé es que firebase.auth() parece usar su propia variante Promise, y bloqueará su aplicación si esa promesa no detecta el error, o incluso arroja el error en el .then / .catch encadenado a él. .

aquí hay una pequeña función que hice que se asegura de convertir la promesa rechazada en una promesa resuelta, antes de volver a convertirla en una promesa rechazada. Esto evitó que mi aplicación fallara, pero no pude encontrar una manera más fácil.

 let firebase_auth_wrap = async (promise) => { let rejected = Symbol(); let value_or_error = await promise.catch((error) => { return { [rejected]: true, error: error }; }); if (value_or_error[rejected]) { throw value_or_error.error; } else { return value_or_error; } } ... let { uid } = await firebase_auth_wrap(firebase.auth().signInWithEmailAndPassword(email, password));

Espero que funcione para usted también, y hágame saber si se puede hacer de manera más intuitiva :)

about 4 years ago · Santiago Trujillo Report

0

Cuando ejecutas esto:

 await auth.sendPasswordResetEmail(req.params.email);

dentro de un bloque try / catch , entonces manejas dos cosas:

  1. El auth.sendPasswordResetEmail() lanza una excepción inmediatamente
  2. El auth.sendPasswordResetEmail() rechaza la promesa devuelta

Lo que no maneja es cuando en alguna otra parte de su código sucede algo y arroja una excepción que no es detectada por nada.

Por supuesto, es imposible decirle dónde sucedió en su caso cuando publica un ejemplo de un mensaje de error que apunta a una línea con miles de caracteres, pero aquí hay un ejemplo simple.

En este ejemplo, captará la promesa rechazada:

 let f = () => new Promise((res, rej) => { rej(new Error('Error')); }); (async () => { try { let x = await f(); console.log('Returned value:', x); } catch (e) { console.log('Handled error:', e.message); } })();

En este ejemplo, captará la excepción lanzada:

 let f = () => new Promise((res, rej) => { throw new Error('Error'); }); (async () => { try { let x = await f(); console.log('Returned value:', x); } catch (e) { console.log('Handled error:', e.message); } })();

En este ejemplo, manejará el rechazo que ocurrió en un tic diferente del bucle de eventos:

 let f = () => new Promise((res, rej) => { setImmediate(() => rej(new Error('Error'))); }); (async () => { try { let x = await f(); console.log('Returned value:', x); } catch (e) { console.log('Handled error:', e.message); } })();

Pero en este ejemplo , no manejará la excepción lanzada en un tic diferente del bucle de eventos:

 let f = () => new Promise((res, rej) => { setImmediate(() => { throw new Error('Error'); }); }); (async () => { try { let x = await f(); console.log('Returned value:', x); } catch (e) { console.log('Handled error:', e.message); } })();

Algo así debe estar pasando en tu caso.

about 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!