Actualmente estoy tratando de publicar datos en mis funciones aws lambda activadas por aws api-gateway usando aws-amplify react lib.
Aquí está el código:
API.post("snippets","snippets/", { body: data, }).then(response => response).catch(console.log(err))En el caso principal, todo está bien.
Pero mi función lambda está diseñada para validar los datos de entrada y devolver un código de estado 400 con una carga útil devuelta que se ve así:
{ "errors": [ { "field": "title", "message": "This field is required" } ] } Me gustaría detectar esos errores para mostrarlos en la interfaz, pero aws-amplify parece tener un comportamiento no documentado.
De forma predeterminada, el código de estado 400 devuelto se lanza con un mensaje de error predeterminado:
Error: Request failed with status code 400 at createError (createError.js:16) at settle (settle.js:18) at XMLHttpRequest.handleLoad (xhr.js:77)¿Hay alguna forma de obtener la carga útil devuelta en lugar de este error mágico?
Resulta que bajo el capó, aws-amplify usa Axios para hacer llamadas http.
Al usar Axios, debe console.log(error.response) : https://github.com/axios/axios/issues/960
Aquí está la solución que he hecho:
API.post("snippets","snippets/", { body: data, }).then(response => response).catch(error => console.log(error.response.data)) Se encuentra abierta una solicitud de extracción en la documentación aws-amplify : https://github.com/aws/aws-amplify/pull/633
También enfrenté problemas similares. Mostraba el mensaje de error predeterminado "Solicitud fallida con el código de estado 400", en lugar del mensaje que devuelve la API.
Registré el objeto Error y no mostró el atributo de respuesta en él. Pero tenemos atributo de respuesta. Intenté registrar Error.response y contenía la respuesta enviada desde la API.
Acabo de descubrir esto revisando los documentos de Amplify 'Cancelar solicitudes de API' .
Por lo que puedo ver, este es el contenido del objeto de error devuelto por la llamada a la API:
Esto es lo que estoy haciendo para imprimir el error, obviamente harías mucho más aquí, pero es un buen comienzo.
async uploadUser(state, payload) { const promise = API.graphql({ query: createUser, variables: { input: payload }, }); try { await promise; } catch (error) { // Print out the actual error given back to us. console.log(error.errors[0].message); // If the error is because the request was cancelled we can confirm here. if (API.isCancel(error)) { // handle user cancellation logic. console.log(error.message); } }Espero que ayude 😃