Javascript es6-它是重新分配还是参数?

Javascript es6-它是重新分配还是参数?,javascript,node.js,express,ecmascript-6,Javascript,Node.js,Express,Ecmascript 6,有人能解释一下这里发生了什么事吗?我知道这些是express的中间件,我正在研究语法 我理解mustBeLoggedIn的es6语法,但我不确定const-probled=message=>(req,res,next)=>{正在运行。message是req,res,next之前的另一个参数吗?如果是,为什么它不在括号中?我原本以为这只是给函数分配了另一个变量名。所以我可以调用它banbidded()或message(),不是吗?但看看它是如何使用的,它看起来更像一个参数 我注意到的另一件有趣的事

有人能解释一下这里发生了什么事吗?我知道这些是express的中间件,我正在研究语法

我理解
mustBeLoggedIn
的es6语法,但我不确定
const-probled=message=>(req,res,next)=>{
正在运行。
message
是req,res,next之前的另一个参数吗?如果是,为什么它不在括号中?我原本以为这只是给函数分配了另一个变量名。所以我可以调用它
banbidded()
message()
,不是吗?但看看它是如何使用的,它看起来更像一个参数

我注意到的另一件有趣的事情是,在get请求中调用了中间件
禁止的
,而
mustBeLoggedIn
仅被传递而未被调用。为什么

const mustBeLoggedIn=(请求、恢复、下一步)=>{
如果(!请求用户){
返回res.status(401).send('您必须登录')
}
下一个()
}
禁止常数=消息=>(请求、恢复、下一步)=>{
资源状态(403).发送(消息)
}
module.exports=require('express').Router()
.get('/',禁止('只有管理员可以列出用户'),(req,res,next)=>
User.findAll()
.then(用户=>res.json(用户))
.catch(下一个)
.post(“/”,(请求、恢复、下一步)=>
User.create(请求主体)
.then(user=>res.status(201).json(user))
.catch(下一个)
.get('/:id',mustBeLoggedIn,(请求、恢复、下一步)=>
User.findById(请求参数id)
.then(user=>res.json(user))

.catch(next))
我不喜欢ES6语法的这种用法,因为它只是为了简洁起见而模糊了代码的含义。最好的代码并不总是以最短的方式编写的。给人们工具,他们有时会不恰当地使用它们

probled()
是一个函数,它接受一个参数
message
,返回一个使用该参数的中间件处理程序。因此,这是一种生成自定义中间件处理程序的方法,该处理程序具有预建的参数。当调用
probled(msg)时
,它返回一个中间件处理程序函数,您可以将其用作中间件

ES5的编写方法(暂时忽略
this
中的差异,这将是不同的,但此处不使用)如下所示:

const forbidden = function(message) {
   return function(req, res, next) {
       res.status(403).send(message);
   }
}
因此,当您调用
禁止(someMsg)
时,您会得到一个可以用作中间件的函数

如果是,为什么不在括号中

使用ES6 arrow语法,单个参数不必在括号中。只有多个参数需要括号

我注意到的另一件有趣的事情是,在get请求中调用了中间件
禁止

这是因为调用它会返回实际的中间件函数,因此必须执行以获取返回值,然后将返回值作为中间件传递

Mustbloggedin只被传递而没有被调用。为什么

因为它已经是一个中间件函数,所以您只想传递对它的引用,而不是调用它


供参考,这条路线:

.get('/', forbidden('only admins can list users'), (req, res, next) => 
    User.findAll()
    .then(users => res.json(users))
    .catch(next))

根据您显示的代码,这对我来说没有意义,因为
禁止()
将返回一个中间件,该中间件将始终返回403响应,并且不允许调用下一个处理程序。这仅在
禁止()
中包含检查当前用户是否实际是管理员的逻辑时才有意义(您没有显示)。

我不喜欢ES6语法的这种用法,因为它只是为了简洁起见而模糊了代码的含义。最好的代码并不总是以最短的方式编写的。给人们工具,他们有时会不恰当地使用它们

probled()
是一个函数,它接受一个参数
message
,返回一个使用该参数的中间件处理程序。因此,这是一种生成自定义中间件处理程序的方法,该处理程序具有预建的参数。当调用
probled(msg)时
,它返回一个中间件处理程序函数,您可以将其用作中间件

ES5的编写方法(暂时忽略
this
中的差异,这将是不同的,但此处不使用)如下所示:

const forbidden = function(message) {
   return function(req, res, next) {
       res.status(403).send(message);
   }
}
因此,当您调用
禁止(someMsg)
时,您会得到一个可以用作中间件的函数

如果是,为什么不在括号中

使用ES6 arrow语法,单个参数不必在括号中。只有多个参数需要括号

我注意到的另一件有趣的事情是,在get请求中调用了中间件
禁止

这是因为调用它会返回实际的中间件函数,因此必须执行以获取返回值,然后将返回值作为中间件传递

Mustbloggedin只被传递而没有被调用。为什么

因为它已经是一个中间件函数,所以您只想传递对它的引用,而不是调用它


供参考,这条路线:

.get('/', forbidden('only admins can list users'), (req, res, next) => 
    User.findAll()
    .then(users => res.json(users))
    .catch(next))

根据您显示的代码,这对我来说没有意义,因为
禁止()
将返回一个中间件,该中间件将始终返回403响应,并且不允许调用下一个处理程序。这仅在
禁止()
中包含检查当前用户是否实际是管理员的逻辑时才有意义(你没有展示).

@Annagaria-我为您的更多问题添加了答案。非常感谢!我确实注意到关于禁止返回403的问题,我想知道为什么,但也忘了问这个问题,所以也感谢您的回答。哈哈。我想这一定是代码中的错误,因为我没有编写它。@Annagaria-我为您的更多问题添加了答案。@Annagaria-我为您的更多问题添加了答案s、 非常感谢!我确实注意到了关于禁止返回403的消息,我想知道为什么,但也忘了问这个问题,所以谢谢你