Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么';这个逻辑怎么了?节点JS_Javascript_Node.js - Fatal编程技术网

Javascript 什么';这个逻辑怎么了?节点JS

Javascript 什么';这个逻辑怎么了?节点JS,javascript,node.js,Javascript,Node.js,我用Node JS构建了一个迷你cms应用程序。我允许用户编辑自己的配置文件,管理员编辑所有配置文件。我有一个奇怪的逻辑问题-如果我使用这种语法,当管理员试图编辑其他用户的配置文件时,我会得到一个错误(401): if (!loggedUser.isAdmin || foundUser.id !== loggedUser.id) { res.status(401).json(); } else { // Save Updated User foundUser.username = r

我用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
对于我来说,很难找到关于布尔否定的好文档或描述,但我认为这篇文章很好地解释了这些概念:


虽然您可以简化布尔表达式,但我认为最好是以一种最有意义的方式编写它们,以便您和您的开发团队阅读,因此我建议您使用第一个块,因为它很容易阅读。否则,请留下有关表达式试图实现的功能的注释。

!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
对于我来说,很难找到关于布尔否定的好文档或描述,但我认为这篇文章很好地解释了这些概念:


虽然您可以简化布尔表达式,但我认为最好是以一种最有意义的方式编写它们,以便您和您的开发团队阅读,因此我建议您使用第一个块,因为它很容易阅读。如果失败,请留下一条关于表达式试图实现什么的注释。

这是因为您的
foundUser.id!==当编辑任何不是您的用户时,loggedUser.id
的计算结果为
true

此外,由于第一个条件评估为
true
,任何非管理员用户都将获得401

使用
|
时,只要满足一个条件,主体就会执行,然后完成。如果只有一个条件为
false
,则它不会移动到else主体。两者都必须为
false


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

这是因为您的
foundUser.id!==当编辑任何不是您的用户时,loggedUser.id
的计算结果为
true

此外,由于第一个条件评估为
true
,任何非管理员用户都将获得401

使用
|
时,只要满足一个条件,主体就会执行,然后完成。如果只有一个条件为
false
,则它不会移动到else主体。两者都必须为
false


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

顶部应该是
&&
。你是说他们不是管理员或不是找到的用户,而在底部你是说“如果他们是管理员或找到的用户,这很酷。”顶部应该是
&&
。你说他们不是管理员或者不是找到的用户,而在底部你说“如果他们是管理员或者找到的用户,这很酷。”