这个逻辑出了什么问题?节点JS

时间:2017-12-15 21:36:19

标签: javascript node.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();
}

有人可以解释这两个条件之间的差异吗?

2 个答案:

答案 0 :(得分:3)

!loggedUser.isAdmin || foundUser.id !== loggedUser.idloggedUser.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

就个人而言,我只会使用你的第二个例子。它更具可读性。