我用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();
}
有人可以解释这两个条件之间的差异吗?
答案 0 :(得分:3)
!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
虽然您可以简化布尔表达式,但我认为最好以最适合您和您的开发团队的方式编写它们,因此我建议您使用第一个块,因为它易于阅读。如果做不到这一点,请对表达式试图完成的内容发表评论。
答案 1 :(得分:0)
这是因为在编辑任何不是您的用户时,foundUser.id !== loggedUser.id
正在评估true
。
要添加,由于第一个条件评估为true
,任何非管理员用户都将获得401。
只要满足一个条件,只有||
,主体将执行,然后完成。如果只有一个条件是false
,它将不会移动到else主体。两者都需要false
就个人而言,我只会使用你的第二个例子。它更具可读性。