这个逻辑出了什么问题?节点JS
我用Node JS构建了一个迷你cms应用程序。我允许用户编辑自己的个人资料和管理员来编辑所有个人资料。我对逻辑有一个奇怪的问题 - 如果我使用这种语法,当管理员试图编辑其他用户的配置文件时,我会收到错误(401)
:
if (!loggedUser.isAdmin || foundUser.id !== loggedUser.id) {
res.status(401).json();
} else {
// Save Updated User
foundUser.username = req.body.username;
foundUser.birthday = req.body.birthday;
foundUser.personalWeb = req.body.personalWeb;
foundUser.location = req.body.location;
foundUser.save().then(() => res.status(200).json(200));
}
但是,如果我使用此语法,权限工作正常:
if (loggedUser.isAdmin || foundUser.id === loggedUser.id) {
// Save Updated User
foundUser.username = req.body.username;
foundUser.profileImg = req.body.profileImg;
foundUser.personalWeb = req.body.personalWeb;
foundUser.location = req.body.location;
foundUser.save().then(() => res.status(200).json(200));
} else {
res.status(401).json();
}
有人可以解释这两个条件之间的区别吗?
回答如下:!loggedUser.isAdmin || foundUser.id !== loggedUser.id
和loggedUser.isAdmin || foundUser.id === loggedUser.id
不是彼此的布尔逆。
第一个是说“如果用户不是管理员,或者找到的用户的id与登录用户的id不匹配”。在管理员的情况下,您会希望他们的ID与找到的用户的ID不匹配。
我认为你的第二个代码块更容易阅读,你应该保留它,但如果你想首先做负面条件,它将是:
!loggedUser.isAdmin && foundUser.id !== loggedUser.id
即:“如果登录用户不是管理员,并且找到的用户ID与登录用户的ID不匹配。”
这也是布尔逆:
!(loggedUser.isAdmin || foundUser.id === loggedUser.id)
// expands to
!loggedUser.isAdmin && foundUser.id !== loggedUser.id
我很难找到好的文档或布尔否定的描述,但是这篇文章很好地解释了我的想法:http://www.math.toronto.edu/preparing-for-calculus/3_logic/we_3_negation.html
虽然您可以简化布尔表达式,但我认为最好以最适合您和您的开发团队的方式编写它们,因此我建议您使用第一个块,因为它易于阅读。如果做不到这一点,请对表达式试图完成的内容发表评论。
这个逻辑出了什么问题?节点JS
我用Node JS构建了一个迷你cms应用程序。我允许用户编辑自己的个人资料和管理员来编辑所有个人资料。我对逻辑有一个奇怪的问题 - 如果我使用这种语法,当管理员试图编辑其他用户的配置文件时,我会收到错误(401)
:
if (!loggedUser.isAdmin || foundUser.id !== loggedUser.id) {
res.status(401).json();
} else {
// Save Updated User
foundUser.username = req.body.username;
foundUser.birthday = req.body.birthday;
foundUser.personalWeb = req.body.personalWeb;
foundUser.location = req.body.location;
foundUser.save().then(() => res.status(200).json(200));
}
但是,如果我使用此语法,权限工作正常:
if (loggedUser.isAdmin || foundUser.id === loggedUser.id) {
// Save Updated User
foundUser.username = req.body.username;
foundUser.profileImg = req.body.profileImg;
foundUser.personalWeb = req.body.personalWeb;
foundUser.location = req.body.location;
foundUser.save().then(() => res.status(200).json(200));
} else {
res.status(401).json();
}
有人可以解释这两个条件之间的区别吗?
回答如下:!loggedUser.isAdmin || foundUser.id !== loggedUser.id
和loggedUser.isAdmin || foundUser.id === loggedUser.id
不是彼此的布尔逆。
第一个是说“如果用户不是管理员,或者找到的用户的id与登录用户的id不匹配”。在管理员的情况下,您会希望他们的ID与找到的用户的ID不匹配。
我认为你的第二个代码块更容易阅读,你应该保留它,但如果你想首先做负面条件,它将是:
!loggedUser.isAdmin && foundUser.id !== loggedUser.id
即:“如果登录用户不是管理员,并且找到的用户ID与登录用户的ID不匹配。”
这也是布尔逆:
!(loggedUser.isAdmin || foundUser.id === loggedUser.id)
// expands to
!loggedUser.isAdmin && foundUser.id !== loggedUser.id
我很难找到好的文档或布尔否定的描述,但是这篇文章很好地解释了我的想法:http://www.math.toronto.edu/preparing-for-calculus/3_logic/we_3_negation.html
虽然您可以简化布尔表达式,但我认为最好以最适合您和您的开发团队的方式编写它们,因此我建议您使用第一个块,因为它易于阅读。如果做不到这一点,请对表达式试图完成的内容发表评论。