Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

534
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda