Javascript es6 – 它重新分配或参数?

有人能解释一下这里发生了什么? 我知道这些是中间件的快递,我正在看语法。

我明白了mustBeLoggedIn的es6语法,但是我不确定什么是const forbidden = message => (req, res, next) => {正在做。 message是req,res,next之前的另一个参数吗? 如果是这样,为什么不在括号内呢? 我原本以为这只是分配另一个variables名称的function。 所以我可以称它为forbidden()message() ,不是吗? 但看看它是如何使用它看起来更像一个参数…

我注意到的另一个有趣的事情是forbidden中间件被调用的get请求和mustBeLoggedIn只被传递,而不是调用。 为什么?

  const mustBeLoggedIn = (req, res, next) => { if (!req.user) { return res.status(401).send('You must be logged in') } next() } const forbidden = message => (req, res, next) => { res.status(403).send(message) } module.exports = require('express').Router() .get('/', forbidden('only admins can list users'), (req, res, next) => User.findAll() .then(users => res.json(users)) .catch(next)) .post('/', (req, res, next) => User.create(req.body) .then(user => res.status(201).json(user)) .catch(next)) .get('/:id', mustBeLoggedIn, (req, res, next) => User.findById(req.params.id) .then(user => res.json(user)) .catch(next)) 

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

forbidden()是一个函数,它接受一个参数message ,返回一个使用该参数的中间件处理程序。 所以,这是一种制作具有预置内置参数的定制中间件处理程序的方法。 当你调用forbidden(msg) ,它会返回一个中间件处理函数,然后你可以用它作为中间件。

ES5写这个的方式(忽略一下这个不一样的区别,但这里不用),看起来像这样:

 const forbidden = function(message) { return function(req, res, next) { res.status(403).send(message); } } 

所以,当你调用forbidden(someMsg) ,你会得到一个可以用作中间件的函数。

如果是这样,为什么不在括号内呢?

使用ES6箭头语法,单个参数不必位于括号内。 只有多个参数需要括号。

我注意到的另一个有趣的事情是forbidden的中间件正在调用get请求

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

而mustBloggedIn只是被传递而没有被调用。 为什么?

因为它已经是一个中间件function,所以你只是想传递一个引用,而不是调用它。


供参考,这条路线:

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

对我来说根据你所显示的代码是没有意义的,因为forbidden()会返回一个中间件,总是返回一个403响应,并且不允许下一个处理程序被调用。 这只对我有意义,如果forbidden()有逻辑来检查当前用户是否实际上是一个pipe理员或不(你不显示)。