-1
votes

Problème d'en-têtes CORS Express Angular

En dev, cela fonctionne bien, j'ai récemment mis à jour le code dans mon vps et j'obtiens une erreur dans la console: Acces to XMLHttpRequest à 'https: //www.example.con/api/register' à partir de l'origine 'https: // example.com 'a été bloqué par la stratégie CORS: aucun en-tête' Access-Control-Allow-Origin 'n'est présent sur la ressource demandée. J'ai essayé avec:

    register: (req, res, next) => {
        let user = new User();
        user.email = req.body.email;
        user.password = req.body.password;
        user.domain = req.body.domain;
    
        user.save((err, doc) => {
            if (!err)
                res.send(doc);
            else {
                if (err.code == 11000) {
                    if(err.keyValue.hasOwnProperty('domain')){
                        res.status(422).send(['Name repeated']);
                    }
                    if(err.keyValue.hasOwnProperty('email')){
                        res.status(422).send(['Email repeated']);
                    }               
                } else {
                    return next(err);
                }
            }
        });
    },

et: app.use (cors ()); mais j'ai toujours le même message dans la console.

  noAuthHeader = { headers: new HttpHeaders({ 'NoAuth': 'True' }) };
  
    postUser(user: User){
    return this.http.post(this.url + '/register', user, this.noAuthHeader);
  }

app.use((req, res, next) => {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Headers', 'Authorization, X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Allow-Request-Method');
    res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, DELETE');
    res.header('Allow', 'GET, POST, OPTIONS, PUT, DELETE');
    next();
});

Les modifications que j'ai faites dans le code sont la vérification dans register () api. J'utilise mongo DB et vérifie le code d'erreur 11000 pour les données de modèle uniques répétées dans DB (champs de messagerie et de domaine). La console renvoie une erreur CORS lorsque j'essaie d'enregistrer un e-mail ou un domaine en double.

EDITED: j'obtiens cette erreur dans la console:

/home/myapp_full/myapp_v0.2/node_modules/mongoose/lib/helpers/promiseOrCallback.js:19 erreur de lancement; ^ TypeError: Impossible de lire la propriété 'hasOwnProperty' non définie.


8 commentaires

le code semble bien fonctionner avant de mettre à jour ceci, en plus de cela, j'ajoute également recaptcha pour éviter l'enregistrement des bots


J'ajoute également les modifications dans le client, pour gérer la clé de recaptcha et ne désactiver que le bouton d'envoi, mais si je crée un nouvel utilisateur `` non répété '', cela fonctionne bien, le problème est lorsque j'essaye d'inscrire un utilisateur enregistré


non, j'envoie un jeton avec un recaptchaService: sendToken (token) {return this._http.post <any> (this.url + "/ recaptcha-validate", {recaptcha: token})} puis j'attends la validation puis envoie le registre () demande à l'API


pour être honnête noAuthHeader je copie simplement l'extrait de code pour que l'enregistrement fonctionne


example.com a été bloqué par la stratégie CORS: aucun en-tête «Access-Control-Allow-Origin» n'est présent sur la ressource demandée.


l'application fonctionne bien lorsque j'enregistre un nouvel utilisateur, le problème est lorsque j'essaye de gérer un utilisateur répété dans le modèle mongoDB en utilisant 'unique: true'


Est-ce que www.example.com et example.com sont deux serveurs séparés ou simplement deux adresses Web distinctes pointant vers le même serveur Web?


J'obtiens cette erreur dans la console: MongoError: E11000 collection d'erreurs de clé en double: myapp.users index: email_1 clé dup: {: "test@test.com"}, je dev sur Windows et cela génère une erreur msj différente, i pense que je trouve le problème, lance «TypeError: impossible de lire la propriété« hasOwnProperty »de non défini»


3 Réponses :


-1
votes

Une fois, j'ai eu le même problème avec Angular et je l'ai résolu en supprimant les en-têtes CORS dans le back-end. J'espère que cela fonctionne pour vous.


3 commentaires

Je ne sais pas comment la suppression des en-têtes CORS dans votre propre backend résoudrait une erreur en raison d'un manque d'en-têtes CORS


Je pense que cela a fonctionné car l'hôte que j'ai utilisé n'en a pas besoin


clairement OP fait, puisque l'erreur est Aucun en-tête `` Access-Control-Allow-Origin '' n'est présent , il y a donc une absence d'en-têtes CORS qui est à l'origine du problème



1
votes

Je ne pense pas que vous devriez avoir besoin de CORS à moins que vous n'ayez réellement l'intention d'avoir deux sites Web distincts: www.example.com et example.com .

Si, à la place, votre serveur est configuré pour accepter les demandes des deux et ne redirige pas, je vous recommande de gérer les redirections dans votre code dans la mesure du possible, afin de sélectionner une URL canonique: soit example.com ou www.example.com . Sauf que, tant que le script existe sur les deux serveurs, il suffit de charger le script sans l'URL (aka "/register" , pas this.url + "/register" )


0 commentaires

-1
votes

Résolu: Il semble que Linux et Windows lancent différents messages d'erreur, j'ai modifié ce morceau de code et cela fonctionne bien, de toute façon la réponse est juste `` email ou nom répété '' et je voudrais gérer chaque donnée unique, j'attends toujours pour une mise à niveau, merci pour votre temps.

 user.save((err, doc) => {
            if (!err)
                res.send(doc);
            else {
                if (err.code == 11000) {
                        res.status(422).send(['Email or name repeated']);
            
                } else {
                    return next(err);
                }
            }
        });


0 commentaires