Je reçois le message d'erreur suivant lorsque j'essaie d'accéder à mon serveur local avec une demande POST:
XMLHttpRequest ne peut pas charger http://127.0.0.1:8000/api/v1/users/login . Aucun en-tête 'Access-Control-Allow-Origin' n'est présent sur la ressource demandée. Origin ' http: // localhost: 8100 ' n'est donc pas autorisé à accéder.
Mon serveur autorise CORS car je l’ai testé en envoyant la demande à postman et cela fonctionne.
Voici mon code dans le front-end:
private headers = new Headers({
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS, PUT, PATCH, DELETE',
'Access-Control-Allow-Headers': 'X-Requested-With,content-type',
'Access-Control-Allow-Credentials': true
});
postLogin(data) {
console.log(data);
return new Promise((resolve) => {
this.http.post(this.api + "users/login", data, {headers: this.headers})
.map(res => res.json())
.subscribe(answer => {
this.loggedIn = true;
this.token = answer.token;
resolve(answer);
});
});
}
PS: je n'ai pas eu cette erreur avec une requête GET.
J'ai essayé de mettre un proxy et ça ne change rien :(
C'est mon ionic.config.json
:
{
"name": "hardShop",
"app_id": "",
"v2": true,
"TypeScript": true,
"proxies": [
{
"path": "/api",
"proxyUrl": "http://127.0.0.1:8000"
}
]
}
Réessayez en utilisant ce plugin dans votre navigateur.
Il vous permet de demander n'importe quelle adresse de n'importe quelle source en contournant les exigences de sécurité de http/https ou d'autres limitations définies par les navigateurs (connu sous le nom CORS ). En pratique, il injecte l'en-tête 'Access-Control-Allow-Origin': '*'
dans la réponse reçue avant il est transmis à votre application.
N'oubliez pas qu'il s'agit d'une solution de type pansement, principalement destinée au développement. Votre réponse (du serveur} _ doit réellement avoir l'en-tête 'Access-Control-Allow-Origin': '*'
, de préférence avec une valeur plus spécifique que *
.
Ce que vous faites maintenant n'a pratiquement aucun effet, puisque vous en tant que client envoyez une demande avec cet en-tête au serveur, qui l'ignore rapidement. Ce qui compte, c’est que le serveur ait cet en-tête dans sa réponse à votre client.
Postman n'applique pas la SCRO pour autant que je sache, alors c'est peut-être pourquoi il n'est pas affecté.
Cette erreur apparaît lorsque vous connectez un Http avec un https c'est-à-dire une couche sécurisée . avec Https à mon application s'exécutant dans localhost.
Pour permettre cela, vous devez installer un plugin dans votre navigateur, ce qui passerait par ce verrou.
Si vous utilisez chrome, installez CORS plug-in pour chrome et cela fonctionnera.
Une des raisons de ce problème peut être (expérience personnelle): Peut-être avez-vous déployé la mauvaise variable connectionstring
pour database
.
J'utilisais les deux connexions de base de données suivantes, une pour le stockage local et l'autre pour le stockage sur serveur
const localhost = await mongoose.connect('mongodb://localhost:27017/categories');
const serverhost = await mongoose.connect('mongodb://usename:[email protected]:12345/myapp');
certains utilisent peut-être deux connectionStrings
comme moi et deploy
le localhost database-connection
au lieu du réel server database-connection
, puis tentent d'accéder à la database
via postman
ou client-application
pour ensuite faire face à ce problème.
Soyez sûr que vous avez deployed
le droit connectionstring
.