J'utilise ExpressJS et j'ai un problème où la méthode .equals() n'est pas reconnue. Les deux objets sont de types différents, mais tous deux ont la même valeur. J'ai modifié l'opérateur en ==, mais il passe continuellement à l'instruction else.

Je veux savoir 'comment' je peux comparer ces deux paramètres et comment je peux corriger l'erreur dans la déclaration if avec l'objectif étant que je m'assure qu'un utilisateur peut modifier un profil if ils sont le propriétaire.

Voici mon code avec la sortie et la base de données. Merci d'avance pour votre aide.

====================== Problème RÉSOLU

Le code:............................................... ..............

app.use("/teachers/:id/editProfile", function (req, res ){

    if(req.isAuthenticated()){
        Teacher.findById(req.params.id, function(err , foundTeacher){
            if(err){
                res.redirect("/teachers");
            }else{

                    console.log("WHAT !    " + foundTeacher._id );
                    console.log("WHAT !    " + req.user.profile );

                    if(req.user.profile.equals(foundTeacher._id) ){
                        res.send("YOU HAVE PERM ............");

                    }else{
                        res.send("YOU DO NOT HAVE PERMISSION TO DO THAT");
                    }
            }
        })
    }else{
        res.send("YOU NEED TO BE LOGGED IN TO DO THAT");
    }

Le résultat:............................................... .....................

WHAT !    5c8b73b2e9b9ec2179224ef4
WHAT !    5c8b73b2e9b9ec2179224ef4

Événements.js:160

  throw er; // Unhandled 'error' event
  ^

TypeError: req.user.profile.equals is not a function
at /home/ubuntu/workspace/LearnFaceToFace/app.js:211:41
at /home/ubuntu/workspace/LearnFaceToFace/node_modules/mongoose/lib/model.js:4719:16
at /home/ubuntu/workspace/LearnFaceToFace/node_modules/mongoose/lib/query.js:4099:12
at process.nextTick (/home/ubuntu/workspace/LearnFaceToFace/node_modules/mongoose/lib/query.js:2681:28)
at _combinedTickCallback (internal/process/next_tick.js:73:7)
at process._tickCallback (internal/process/next_tick.js:104:9)

DB de mangouste : .................................................. ..................

db.teachers.find()

{ "_id" : ObjectId("5c8b73b2e9b9ec2179224ef4"), "name" : "mr.s", "teachingField" : "math", "price" : "111$", "contact" : "ddd@gmail.com", "note" : "best page", "sex" : "male", "image" : "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSx2puLa7PoZiDMIAGChIP73M6NhfchM6A8ia_ZQXwmGP6IdtlnAw", "__v" : 0 }

db.users.find()

{ "_id" : ObjectId("5c8b73a6e9b9ec2179224ef3"), "profile" : [ ObjectId("5c8b73b2e9b9ec2179224ef4") ], "username" : "s1", "salt" : "e1c55598efe775b66bbf95ed7978e8ec410d8d2983823336eb6f59ac28ddfb6c", "hash" : "3bd7c4e2d2aab447919225a635cf8452afab8162dcf105c6508a1a646f497ddea21c922ae870a9364a2b93317d64802a0c59fe5aafa9cf94cc331a1e3b91fff2c503ab4e4c9939c348f5ff7be447292005bc80b661594e8bbff32eb425958b713e2545af33c06f963996aba85317f766c4c5a2942d85de86efd4dae8e15c46a4e7483853947ff5ec34595fbbec1ead920992aeff7a2bf84451207cd12123f586292a6e8a35d0ddb83cd2c99c9159511e82a3a28a4a5ceec6e9b7125df801800c8b78d417b411ff7478b200dfa746e9ee05a034e186c8670eba0984eb20610a16bad9cd823c21dadb9d9c1193b06d69cab85c00f1679025de66b16aecfc045618b69091fe556b1400737778558ff10f6030b39d98441ea00e33bb38a03303feaadf1493d0e4f9a3f048f98263d89994abc9ce97f8633976824248631e8fbcd02b502e8bc5e98c55dc0c8cedfbfab799a3de5a1ebcdd9c1f2f084b230a2f48da016b6000f9314052b8e1c4445023b9241167e0fce9db54f849c5face9fb39e4a56f2b78f61e80f5d74680c407e6cd61fb3249dab8f93f8bdf9cb59372879fffc4ffb14c84f3ab2e064240efc13b82d6f9ec79b8a6ccdebf8581ab1d4cb9275a42b04718b3ad56adca90e7cc434ff64afd4cfe35c80c32ea57b4e2f80be779b0dd64116c8006cacc64ab5d81c78100f8a29664960a14bfd40ad16e4a58e7d3540df", "__v" : 1 }

Le schéma de l'utilisateur .................................................. .....

var UserSchema = new mongoose.Schema({

    username: String,

    password: String,

    profile:[

        {type: mongoose.Schema.Types.ObjectId,

        ref: "profile"

        }]

});
0
Anas 16 mars 2019 à 01:05

2 réponses

Meilleure réponse

Ok, tout d'abord. Lorsque quelque chose ne va pas et que vous décidez de le déboguer avec console.log, n'utilisez JAMAIS +. Oui, je sais qu'il est avantageux d'obtenir une étiquette sur ces données, mais voici l'astuce : ceci...

console.log('SOME_LABEL:', some_data);

... vous donnera plus ou moins d'informations détaillées sur ces données. Et ça...

console.log('SOME_LABEL:' + some_data);

... vous montrera toujours une chaîne - résultat de la concaténation de SOME_LABEL chaîne et some_data transformer en chaîne. Et oui, en JS, quelque chose converti en chaîne n'est pas la même chose que la représentation de ce quelque chose.

En fait, c'est exactement le problème ici. Les deux valeurs cochées ne sont pas des chaînes - ce sont des objets (*). Et à moins que vous n'ayez le même objet des deux côtés de == ou ===, vous devriez toujours vous attendre à obtenir false de cette opération. Encore une fois, c'est le cas ici.

Oui, il existe des méthodes utilitaires sur certaines bibliothèques (_.isEqual) qui permettent de comparer des objets par value, mais ces méthodes sont appelées essentiellement comme des fonctions autonomes et ne deviennent pas automatiquement disponibles sur tous les objets. Et il y a une raison à cela.

Habituellement, lorsque vous avez besoin de comparer deux objets du même type (classe), vous feriez mieux d'implémenter une méthode de comparaison sur eux ou de les comparer à des primitives. Sinon, vous finirez par vérifier encore et encore les propriétés utiles et quelque chose qui n'a pas vraiment besoin d'être comparé.

Dans ce cas particulier, il existe une propriété sur ObjectId uniquement à des fins de comparaison - str :

str

Renvoie la représentation sous forme de chaîne hexadécimale de l'objet.

Une approche possible pour effectuer le contrôle est donc la suivante :

if (req.user.profile.str === foundTeacher._id.str) { ... }

*D'accord, foundTeacher._id est ObjectId, mais vous feriez mieux de vérifier ce qu'est réellement req.user.profile. S'il s'agit d'une chaîne, supprimez simplement cette vérification de propriété str.

2
raina77ow 15 mars 2019 à 22:46

Vous devriez en fait essayer de le faire dans l'autre sens.

foundTeacher._id.equals(req.user.profile)

Les opérateurs "===" ou "==" ne fonctionneront pas dans ce cas car l'un des identifiants est une chaîne et l'autre est mongodb objectid, vous devez donc utiliser la méthode fournie par mongoose pour les comparer aux valeurs.

0
cEeNiKc 15 mars 2019 à 23:21