javascript - usar - unexpected end of json input react fetch




Handle response-SyntaxError: Fim de entrada inesperado ao usar o modo: 'no-cors' (4)

Eu tentei uma chamada de busca ReactJS para uma API REST e quero manipular a resposta. A chamada funciona, eu recebo uma resposta, que eu posso ver no Chrome Dev Tools:

function getAllCourses() {
fetch('http://localhost:8080/course', {
    method: 'POST',
    mode: 'no-cors',
    credentials: 'same-origin',
    headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json',
    },
    body: JSON.stringify({
        objectClass: 'course',
        crud: '2'
    })
}).then(function (response) {
    console.log(response);
    return response.json();

}).catch(function (err) {
    console.log(err)
});
}

Quando tento lidar com a resposta, recebi um "SyntaxError: Unexpected end of input" em

return response.json();

O console.log se parece com isso:

Minha resposta JSON parece com isso, é válido, eu verifiquei com jsonlint:

[
  {
    "0x1": {
      "users": [],
      "lectures": [],
      "owner": "0x2",
      "title": "WWI 14 SEA",
      "description": null,
      "objectClass": "course",
      "id": "course_00001"
    },
    "0x2": {
      "username": "system",
      "lectures": [],
      "course": null,
      "solutions": [],
      "exercises": [],
      "roles": [
        "0x3",
        "0x4",
        "0x5"
      ],
      "objectClass": "user",
      "id": "user_00001"
    },
    "0x3": {
      "roleName": "ROLE_ADMIN",
      "objectClass": "role",
      "id": "role_00001"
    },
    "0x4": {
      "roleName": "ROLE_STUDENT",
      "objectClass": "role",
      "id": "role_00002"
    },
    "0x5": {
      "roleName": "ROLE_DOCENT",
      "objectClass": "role",
      "id": "role_00003"
    }
  }
]

Em seu then você deve verificar se a resposta está OK antes de retornar response.json :

.then(function (response) {
    if (!response.ok) {
        return Promise.reject('some reason');
    }

    return response.json();

})

Se você quiser ter a mensagem de erro em sua promessa rejeitada, você pode fazer algo como:

.then(function (response) {
    if (!response.ok) {
       return response.text().then(result => Promise.reject(new Error(result)));
    }

    return response.json();
})

Eu sei que esta resposta pode ser super tarde e poderia ter sido resolvido, mas eu só tinha o mesmo problema hoje e eu só precisava adicionar um ',' no final do hash cabeçalhos e eu parei de receber o erro

export function addContacts(formData) {
  return(dispatch) => {
    dispatch({type: 'POSTING_CONTACTS'});
    console.log(formData)
    return fetch(uri, {
      method: 'POST',
      body: JSON.stringify({contact: {name: formData.name, phone_number: formData.phoneNumber}}),
      headers: {
        Accept: 'application/json',
        'Content-Type': 'application/json'
      },
    })
    .then(response => {
        return response.json()
      }).then(responseJSON => {
        console.log(responseJSON)
        return dispatch({type: 'ADD_CONTACT', payload: responseJSON});
      })
  }
}     

Você pode evitar o problema com a diretiva CORS adicionando no cabeçalho do php ou em outro ponto de extremidade do servidor a linha:

<?php
header('Access-Control-Allow-Origin: *');
//or
header('Access-Control-Allow-Origin: http://example.com');

// Reading JSON POST using PHP
$json = file_get_contents('php://input');
$jsonObj = json_decode($json);

// Use $jsonObj
print_r($jsonObj->message);

...
// End php
?>

O modelo de código de busca de trabalho com solicitação POST é:

const data = {
        optPost: 'myAPI',
        message: 'We make a research of fetch'
    };
const endpoint = 'http://example.com/php/phpGetPost.php';

fetch(endpoint, {
    method: 'POST',
    body: JSON.stringify(data)
})
.then((resp) => resp.json())
.then(function(response) {
    console.info('fetch()', response);
    return response;
});

Você precisa remover o mode: 'no-cors' configuração mode: 'no-cors' do seu pedido. Esse mode: 'no-cors' é exatamente a causa do problema que você está tendo.

Um mode: 'no-cors' pedido mode: 'no-cors' torna o tipo de resposta opaque . O trecho de log do console na pergunta mostra claramente isso. E opaque significa que seu código JavaScript frontend não pode ver o corpo ou os cabeçalhos de resposta.

https://developer.mozilla.org/en-US/docs/Web/API/Request/mode explica:

no-cors - JavaScript não pode acessar nenhuma propriedade da Response resultante

Portanto, o efeito do mode: 'no-cors' de configuração mode: 'no-cors' é essencialmente dizer aos navegadores: “Não permita que o código JavaScript frontend acesse o corpo ou os cabeçalhos de resposta sob nenhuma circunstância”.

Eu imagino que você está definindo o mode: 'no-cors' para a solicitação porque a resposta do http://localhost:8080/course não inclui o cabeçalho de resposta Access-Control-Allow-Origin ou porque o seu navegador está fazendo uma OPTIONS solicite a http://localhost:8080 porque sua solicitação é aquela que aciona uma pré-impressão do CORS .

Mas o mode: 'no-cors' configuração mode: 'no-cors' não é a solução para esses problemas. A solução é para:





fetch-api