2017-10-14 13 views
0

J'essaie de demander des données JSON à partir de l'API Genius à partir d'un navigateur utilisant Webpack et Axios.Demande d'origine croisée à l'API pour les données JSON - "Vous pouvez avoir besoin d'un chargeur approprié pour gérer ce type de fichier."

Il s'agit d'une demande d'origine croisée, que je sais parfois difficile. Pendant un certain temps, je recevais l'erreur suivante:

Failed to load https://api.genius.com/songs/378195: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. The response had HTTP status code 403. 

Je puis ajouté Access-Control-Allow-Origin: * aux en-têtes. Maintenant, je reçois l'erreur suivante lorsque je tente de lancer npm run build:

You may need an appropriate loader to handle this file type. 
| const headers = { 
| Authorization: `Bearer ${ACCESS_TOKEN}`, 
| Access-Control-Allow-Origin: * 
| }; 
| 

Voici mes index.js d'entrée qui est fourni, avec mon jeton d'accès retiré. Je sais que webpack 2.x^charge JSON par défaut. Des conseils sur où aller à partir d'ici?

index.js

const axios = require('axios'); 

const ACCESS_TOKEN = "XXXXXXXXXXXXXX"; 
const id = '378195'; 
const url = `https://api.genius.com/songs/${id}` 
const headers = { 
    Authorization: `Bearer ${ACCESS_TOKEN}`, 
    "Access-Control-Allow-Origin": "*" 
}; 

window.newSong = function { 
    axios.get(url, { headers }) 
    .then(response => { 
     console.log(response.data.response.song); 
    }) 
    .catch(error => { 
     console.log(error); 
    }); 
} 

webpack.config.js

const path = require('path'); 

const config = { 
    entry: './src/index.js', 
    output: { 
     filename: 'bundle.js', 
     path: path.resolve(__dirname, 'dist') 
    } 
}; 
module.exports = config; 

Répondre

1

Votre headers définition n'est pas JavaScript valide. Si la clé d'un objet contient des caractères spéciaux qui sont réservés dans la langue, vous devez le citer, car il n'est pas analysé en tant qu'identifiant. Par exemple: Access-Control est équivalent à Access - Control, c'est une soustraction et les espaces autour de l'opérateur ne font pas de différence pour l'analyseur.

La valeur que vous lui attribuez n'est pas non plus un code JavaScript valide, car * est l'opérateur de multiplication, qui attend deux opérandes (gauche et droite). Si vous voulez la valeur littérale, cela devrait être une chaîne.

const headers = { 
    Authorization: `Bearer ${ACCESS_TOKEN}`, 
    "Access-Control-Allow-Origin": "*" 
}; 
+0

Merci d'avoir signalé cela. Cependant, j'ai fait les changements ci-dessus et maintenant je reçois la première erreur dans ma question initiale - 'Non 'Access-Control-Allow-Origin' en-tête est présent sur la ressource demandée. L'origine 'null' n'est donc pas autorisée. 'Des idées? – Evan

+1

L'en-tête 'Access-Control-Allow-Origin' est pour la réponse (du serveur), pas pour la requête. Pour plus de détails, voir [Comment fonctionne l'en-tête Access-Control-Allow-Origin?] (Https://stackoverflow.com/questions/10636611/how-does-access-control-allow-origin-header-work). Je ne suis pas sûr de savoir exactement quel est le problème, mais cela peut être lié à leur API, car il semble qu'ils ne gèrent pas correctement la demande de contrôle en amont 'OPTIONS'. –