Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

223
Vistas
La excepción lanzada en las funciones async/await anidadas provoca un comportamiento inesperado

Tengo una función asíncrona:

 const jwtDecode = async (token) => { //return jsonwebtoken.verify(token, TOKEN_SECRET) console.log("jwt decode, token: " + token) try { const { payload } = await jose.jwtVerify(token, new TextEncoder().encode(TOKEN_SECRET)) return payload } catch (e) { console.log("Caught error jwt decode") console.error(e.message, e.stack) return {} } }

Esa función está envuelta por algunas otras funciones asíncronas, donde se usa await.

 const foo = async (token) => { const {userId} = await jwtDecode(token) return userId } const foo2 = async (token) => { const userId = await foo(token) return userId } const userId = await foo2(token)

Cuando se lanza una excepción en jwtDecode, toda la cadena parece olvidarse de await y se ejecuta como si no existiera. Además de eso, la llamada a foo2 devuelve una Promesa en lugar de 'indefinido'

Sé que hay una explicación lógica para esto. ¿Alguien podría explicar y dar la solución? Gracias

ACTUALIZAR:

Aquí está el código completo:

Esta primera llamada ocurre en mi _middleware.js (estoy usando Next.js)

 export async function middleware(req, ev) { ... ... ... const userId = await serverUtils.authorizeRequest(req) ... ... ...
 const authorizeRequest = async (req) => { const accessToken = req.cookies.PictosAT let { userId } = await jwtDecode(accessToken) if (!userId) { userId = null } console.log("Authorize request userId is " + userId) return userId } const jwtDecode = async (token) => { console.log("jwt decode, token: " + token) try { const { payload } = await jose.jwtVerify(token, new TextEncoder().encode(TOKEN_SECRET)) return payload } catch (e) { console.log("Caught error jwt decode") console.error(e.message, e.stack) return {} } }
about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

No estás atrapando en el lugar adecuado. Necesita que los consumidores de jwtDecode puedan determinar si la función tuvo éxito o no. Con su enfoque actual, return {} significa que en la parte superior de la cadena, const userId = await foo2(token) asignará undefined a userId . Si detecta dentro de jwtDecode , eso significa que sus consumidores no pueden ver que hubo un error.

Averigüe dónde se puede detectar significativamente el error. Si quieres esta línea:

 const userId = await foo2(token)

para no ejecutar en absoluto si hay un problema, omita la catch por completo para que el error se detecte aún más arriba en la cadena, o vuelva a lanzar el error dentro jwtDecode para que otras funciones puedan ver que falló.

Otra opción es atrapar en el punto de asignación a userId y luego verificar si es cierto o no.

 const jwtDecode = async (token) => { const { payload } = await jose.jwtVerify(token, new TextEncoder().encode(TOKEN_SECRET)) return payload } const foo = async (token) => { const {userId} = await jwtDecode(token) return userId } const foo2 = async (token) => { return foo(token); } // resolve to undefined if there was an error: const userId = await foo2(token).catch(() => {}); if (!userId) { // put your desired error handling here... return; } // continue on with code that depends on the populated userId here
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda