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 {} } }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