TypeError: $.equals is not a function
TypeError: $.equals is not a function
我正在使用 ExpressJS,我遇到了 .equals()
方法无法识别的问题。这两个对象属于不同的类型,但都具有相同的值。我修改运算符为==
,但它不断跳转到else语句。
我想知道 'how' 我可以比较这两个参数以及如何使用 [=46 更正 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)
猫鼬数据库:................................................ .........
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"
}]
});
好的,重要的是。当出现问题时,你决定使用 console.log 调试它,永远不要使用 +
。是的,我知道在该数据上添加一些标签是有益的,但诀窍在于:这...
console.log('SOME_LABEL:', some_data);
... 将为您提供有关此数据的详细信息。还有这个……
console.log('SOME_LABEL:' + some_data);
... 总是 显示一个字符串 - SOME_LABEL 字符串和 some_data cast[=47 的连接结果=] 到字符串。是的,在 JS 中 something cast to string 与 this something 的表示不同。
事实上,这正是问题所在。两个选中的值都不是字符串——它们是对象 (*)。除非你在 ==
或 ===
的两边都有相同的对象,否则你应该总是期望从该操作中得到 false
。同样,这里就是这种情况。
是的,一些库 (_.isEqual) 上有一些实用方法可以让您按值比较对象,但这些方法本质上是作为独立函数调用的,不会自动在所有对象上可用。这是有原因的。
通常当您确实需要比较两个相同类型的对象时 (class),您最好在它们上实现一些比较方法或将它们转换为基元进行比较。否则你最终会一次又一次地检查有用的属性和一些不需要比较的东西。
在这种特殊情况下,ObjectId
上有一个 属性 只是为了比较目的 - str:
str
Returns the hexadecimal string representation of the object.
因此,一种可能的检查方法是:
if (req.user.profile.str === foundTeacher._id.str) { ... }
*好的,foundTeacher._id
是ObjectId,但是你最好仔细检查一下req.user.profile
究竟是什么。如果它是一个字符串,只需删除 str
属性 检查。
你实际上应该尝试反过来做。
foundTeacher._id.equals(req.user.profile)
"===" 或 "==" 运算符在这种情况下不起作用,因为其中一个 id 是字符串,另一个是 mongodb objectid,因此您必须使用提供的方法猫鼬将这些与值进行比较。
我正在使用 ExpressJS,我遇到了 .equals()
方法无法识别的问题。这两个对象属于不同的类型,但都具有相同的值。我修改运算符为==
,但它不断跳转到else语句。
我想知道 'how' 我可以比较这两个参数以及如何使用 [=46 更正 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)
猫鼬数据库:................................................ .........
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"
}]
});
好的,重要的是。当出现问题时,你决定使用 console.log 调试它,永远不要使用 +
。是的,我知道在该数据上添加一些标签是有益的,但诀窍在于:这...
console.log('SOME_LABEL:', some_data);
... 将为您提供有关此数据的详细信息。还有这个……
console.log('SOME_LABEL:' + some_data);
... 总是 显示一个字符串 - SOME_LABEL 字符串和 some_data cast[=47 的连接结果=] 到字符串。是的,在 JS 中 something cast to string 与 this something 的表示不同。
事实上,这正是问题所在。两个选中的值都不是字符串——它们是对象 (*)。除非你在 ==
或 ===
的两边都有相同的对象,否则你应该总是期望从该操作中得到 false
。同样,这里就是这种情况。
是的,一些库 (_.isEqual) 上有一些实用方法可以让您按值比较对象,但这些方法本质上是作为独立函数调用的,不会自动在所有对象上可用。这是有原因的。
通常当您确实需要比较两个相同类型的对象时 (class),您最好在它们上实现一些比较方法或将它们转换为基元进行比较。否则你最终会一次又一次地检查有用的属性和一些不需要比较的东西。
在这种特殊情况下,ObjectId
上有一个 属性 只是为了比较目的 - str:
str
Returns the hexadecimal string representation of the object.
因此,一种可能的检查方法是:
if (req.user.profile.str === foundTeacher._id.str) { ... }
*好的,foundTeacher._id
是ObjectId,但是你最好仔细检查一下req.user.profile
究竟是什么。如果它是一个字符串,只需删除 str
属性 检查。
你实际上应该尝试反过来做。
foundTeacher._id.equals(req.user.profile)
"===" 或 "==" 运算符在这种情况下不起作用,因为其中一个 id 是字符串,另一个是 mongodb objectid,因此您必须使用提供的方法猫鼬将这些与值进行比较。