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

时间:2017-02-23 04:26:36

标签: javascript node.js express ecmascript-6

有人可以解释一下这里发生了什么吗?我知道这些是Express的中间件,我正在查看语法。

我理解mustBeLoggedIn的es6语法,但我不确定const forbidden = message => (req, res, next) => {正在做什么。 message是req,res,next之前的另一个参数吗?如果是这样,为什么它不在括号中?我原本以为这只是为函数分配另一个变量名。我可以将其称为forbidden()message(),不是吗?但看看它是如何被使用的,它看起来更像是一个参数...

我注意到的另一个有趣的事情是,在get请求中调用了中间件forbidden,并且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))




1 个答案:

答案 0 :(得分:5)

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

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

ES5写这篇文章的方式(暂时忽略this的不同之处,但不会在这里使用),看起来像这样:

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

因此,当您调用forbidden(someMsg)时,您将获得一个可用作中间件的函数。

  

如果是这样,为什么它不在括号中?

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

  

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

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

  

和mustBeLoggedIn仅被传递而不被调用。为什么呢?

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

仅供参考,这条路线:

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

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