Ошибка типа: $ .equals не является функцией - PullRequest
0 голосов
/ 16 марта 2019

Я использую ExpressJS, и у меня проблема с тем, что метод .equals() не распознается.Два объекта имеют разные типы, но оба имеют одинаковое значение.Я изменил оператор на ==, но он постоянно переходит к оператору else.

Я хочу знать 'как' Я могу сравнить эти два параметра и то, как я могу исправить ошибку в выражении if, с целью обеспечения того, чтобы пользователь мог редактироватьпрофиль if они являются владельцем.

Вот мой код вместе с выводом и базой данных.Заранее благодарим за помощь.

====================== Проблема решена

код:.............................................................

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");
    }

выход: .................................................................

WHAT !    5c8b73b2e9b9ec2179224ef4
WHAT !    5c8b73b2e9b9ec2179224ef4

events.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)

mongoose DB: ................................................................

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 }

Схема пользователя ....................................................

var UserSchema = new mongoose.Schema({

    username: String,

    password: String,

    profile:[

        {type: mongoose.Schema.Types.ObjectId,

        ref: "profile"

        }]

});

Ответы [ 2 ]

0 голосов
/ 16 марта 2019

На самом деле вы должны попытаться сделать это наоборот.

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

"===" или "==" операторы не будут работать в этом случае, так как один из идентификаторов является String идругой - mongodb objectid, поэтому вы должны использовать метод, предоставленный mongoose, чтобы сравнить их со значениями.

0 голосов
/ 16 марта 2019

Хорошо, обо всем по порядку. Если что-то идет не так и вы решаете отладить его с помощью console.log, НИКОГДА не используйте +. Да, я знаю, что было бы полезно получить некоторую метку для этих данных, но вот хитрость: это ...

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

... даст вам более-менее подробную информацию об этих данных. И это ...

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

... будет всегда показывать вам строку - результат объединения строк SOME_LABEL и some_data приведение к строке. И да, в JS что-то, приведенное к строке, отличается от представления этого чего-либо.

На самом деле, в этом-то и проблема. Оба проверенных значения не являются строками - они являются объектами (*). И если у вас нет одного и того же объекта по обе стороны от == или ===, вы всегда должны ожидать получения false от этой операции. Опять же, это здесь.

Да, в некоторых библиотеках есть служебные методы ( _. IsEqual ), которые позволяют сравнивать объекты по значению, но эти методы по сути называются автономными функциями и не становятся доступными для всех объектов автоматически , И для этого есть причина.

Обычно, когда вам нужно сравнить два объекта одного и того же типа (класса), вам лучше либо реализовать какой-либо метод сравнения на них, либо сравнить их приведенные к примитивам. В противном случае вы снова и снова будете проверять полезные свойства и то, что действительно не нужно сравнивать.

В данном конкретном случае для ObjectId есть свойство только для этой цели сравнения - str :

str

Возвращает шестнадцатеричное строковое представление объекта.

Итак, один из возможных подходов к проверке заключается в следующем:

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

* Хорошо, foundTeacher._id - это ObjectId, но вам лучше перепроверить, что на самом деле req.user.profile. Если это строка, просто отбросьте проверку str свойства.

...