Estoy usando el complemento restivus para manejar mis solicitudes de Api.
El problema al que me enfrento es:
Si Api devuelve el código de estado 200 , todo funciona bien.
Pero si envío un token de portador de autenticación no válido en el encabezado o si devuelve algún error de la API, por ejemplo, 422, 401, 400, etc., mi solicitud de ajax falla y da este error:
CORS header 'Access-Control-Allow-Origin' missingAquí están mis confirmaciones restivus:
myApi = new Restivus({ apiPath: 'api/', defaultHeaders: { "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Credentials": "true", "Access-Control-Allow-Headers": "Access-Control-Allow-Headers, Access-Control-Request-Method, Connection, Content-Language, Access-Control-Request-Headers, Origin, X-Requested-With, Content-Type, Accept-Language, Accept, Z-Key, Authorization, client-id, client-secret, client_id, client_secret", "Content-Type": "application/json", "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS" }, enableCors: true, useDefaultAuth: false, prettyJson: true, defaultOptionsEndpoint: { action: function() { this.response.writeHead(201, { "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Credentials": "true", "Access-Control-Allow-Headers": "Access-Control-Allow-Headers, Access-Control-Request-Method, Connection, Content-Language, Access-Control-Request-Headers, Origin, X-Requested-With, Content-Type, Accept-Language, Accept, Z-Key, Authorization, client-id, client-secret, client_id, client_secret", "Content-Type": "application/json", "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS" }); this.done(); return { status: "success", "data": { "message": "We love OPTIONS" } }; } } });¿Alguien sabe lo que me estoy perdiendo aquí?
Sé que generalmente es estándar no enviar encabezados como Access-Control-Allow-Origin en solicitudes fallidas (4xx, 5xx). Solucioné esto en el pasado alojando una API detrás de un servidor web como Apache, y luego instruyendo al servidor web para que siempre configure el encabezado de respuesta Access-Control-Allow-Origin , ignorando el código de estado.
(Esta es una opción. Un ejemplo de esto se puede encontrar aquí )
También fui y miré la documentación de Restivus específicamente en la configuración de defaultHeaders para ver si mencionan este comportamiento. Desafortunadamente, no mencionan esto. Pero sí mencionan que puede anular el comportamiento del encabezado predeterminado al proporcionar explícitamente los encabezados en su objeto de respuesta.
Entonces podrías definir una clase de Response similar a esta
class Response{ constructor(statusCode, body){ this.statusCode = statusCode; this.body = body; this.headers = { "Access-Control-Allow-Origin": "*" }; } } Luego, simplemente devuelva un objeto de Response cada vez que envíe una respuesta, obviamente configurando el statusCode de estado y body según sea necesario.
Intentaría configurar enableCors en false .
Eché un vistazo al código de los paquetes, es posible cuando esta opción se establece en verdadero, el paquete reemplaza su valor personalizado Access-Control-Allow-Headers con el valor predeterminado del paquete de Origin, X-Requested-With, Content-Type, Accept
El mensaje de error no tiene mucho sentido con este razonamiento, pero vale la pena intentarlo.
hola, esto se debe a que cada vez que el servidor devuelve el código de estado de error del servidor, el retorno de ajax no devolverá la respuesta como su respuesta de estado de retorno ok (200), debe detectar el error de solicitud para manejar el error
function makeRequest(endpoint, body){ $.ajax({ url: 'http://localhost:3000/' + endpoint, type: "POST", dataType: "JSON", contentType: "application/json; charset=utf-8", data: body, success: function(resp){ return resp } }).then((resp)=>{ //handle success }, err =>{ //handle error }); }