Javascript TypeError:$.equals不是函数
我使用的是ExpressJS,我有一个问题,Javascript TypeError:$.equals不是函数,javascript,node.js,express,mongoose,backend,Javascript,Node.js,Express,Mongoose,Backend,我使用的是ExpressJS,我有一个问题,.equals()方法无法识别。这两个对象的类型不同,但都具有相同的值。我将操作符修改为==,但它会连续跳转到else语句 我想知道'how'我可以比较这两个参数,以及如何纠正if语句中的错误,目的是确保用户可以编辑配置文件如果他们是所有者 这是我的代码以及输出和数据库。提前感谢您的帮助 ============================问题已解决 守则: app.use("/teachers/:id/editProfile", function
.equals()
方法无法识别。这两个对象的类型不同,但都具有相同的值。我将操作符修改为==
,但它会连续跳转到else语句
我想知道'how'我可以比较这两个参数,以及如何纠正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
var UserSchema = new mongoose.Schema({
username: String,
password: String,
profile:[
{type: mongoose.Schema.Types.ObjectId,
ref: "profile"
}]
});
输出:
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
var UserSchema = new mongoose.Schema({
username: String,
password: String,
profile:[
{type: mongoose.Schema.Types.ObjectId,
ref: "profile"
}]
});
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)
猫鼬数据库:
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
var UserSchema = new mongoose.Schema({
username: String,
password: String,
profile:[
{type: mongoose.Schema.Types.ObjectId,
ref: "profile"
}]
});
db.teachers.find()
db.users.find()
用户架构
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
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);
。。。将始终向您显示一个字符串-将一些\u标签字符串和一些\u数据连接到字符串的结果。是的,在JS中,转换为字符串的东西与这个东西的表示不同
事实上,这正是问题所在。两个选中值都不是字符串-它们是对象(*)。除非在==
或==
的两侧都有相同的对象,否则您应该始终期望从该操作中获得false
。这里也是这样
是的,某些库()上有一些实用程序方法,允许您按值比较对象,但这些方法基本上是作为独立函数调用的,不会自动在所有对象上可用。这是有原因的
通常,当您确实需要比较两个相同类型(类)的对象时,最好对它们实现一些比较方法,或者将它们转换为基本体。否则,您将一次又一次地检查有用的属性和不需要比较的内容
在这种特殊情况下,ObjectId
上有一个属性,用于进行比较-:
str
返回对象的十六进制字符串表示形式
因此,进行检查的一种可能方法是:
if (req.user.profile.str === foundTeacher._id.str) { ... }
*好的,foundTeacher.\u id
是ObjectId,但您最好仔细检查req.user.profile
实际上是什么。如果是字符串,只需删除属性检查。好的,首先要做的事情。当出现问题时,您决定使用console.log对其进行调试,切勿使用+
。是的,我知道在这些数据上贴上标签是有益的,但这里有个窍门:这
console.log('SOME_LABEL:', some_data);
。。。将为您提供有关此数据的详细信息。而这个
console.log('SOME_LABEL:' + some_data);
。。。将始终向您显示一个字符串-将一些\u标签字符串和一些\u数据连接到字符串的结果。是的,在JS中,转换为字符串的东西与这个东西的表示不同
事实上,这正是问题所在。两个选中值都不是字符串-它们是对象(*)。除非在==
或==
的两侧都有相同的对象,否则您应该始终期望从该操作中获得false
。这里也是这样
是的,某些库()上有一些实用程序方法,允许您按值比较对象,但这些方法基本上是作为独立函数调用的,不会自动在所有对象上可用。这是有原因的
通常,当您确实需要比较两个相同类型(类)的对象时,最好对它们实现一些比较方法,或者将它们转换为基本体。否则,您将一次又一次地检查有用的属性和不需要比较的内容
在这种特殊情况下,ObjectId
上有一个属性,用于进行比较-:
str
返回对象的十六进制字符串表示形式
因此,进行检查的一种可能方法是:
if (req.user.profile.str === foundTeacher._id.str) { ... }
*好的,foundTeacher.\u id
是ObjectId,但您最好仔细检查req.user.profile
实际上是什么。如果它是一个字符串,只需删除属性检查。您实际上应该尝试另一种方法
foundTeacher._id.equals(req.user.profile)
“==”或“==”运算符在这种情况下不起作用,因为其中一个ID是字符串,另一个是mongodb objectid,因此您必须使用mongoose提供的方法将这些值与值进行比较。您应该尝试另一种方法
foundTeacher._id.equals(req.user.profile)
“==”或“==”运算符在这种情况下不起作用,因为其中一个ID是字符串,另一个是mongodb objectid,因此您必须使用mongoose提供的方法将这些值与值进行比较。可能您的一些用户有配置文件,而一些用户没有配置文件?-在使用它之前检查它是否存在-尽管您还需要决定如果用户没有配置文件该怎么办-可能您的一些用户有配置文件,而一些没有在使用它之前检查它是否存在-虽然您还需要先决定如果用户没有配置文件该怎么办,但我将我的检查方法console.log从+改为“”,这确实有助于新结果:什么!5c8b73b2e9b9ec2179224ef4什么![“5c8b73b2e9b9ec2179224ef4”]第二,很好的澄清,我真的不认为类型会有多大影响,特别是当我以前的“坏”检查方法是retu时