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

Tur*_*ets 1 javascript node.js express ecmascript-6

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

我理解es6语法,mustBeLoggedIn但我不确定const forbidden = message => (req, res, next) => {是做什么的.是messagereq,res,next之前的另一个参数吗?如果是这样,为什么它不在括号中?我原本以为这只是为函数分配另一个变量名.所以我可以称之为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))
Run Code Online (Sandbox Code Playgroud)

jfr*_*d00 5

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

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

写这篇文章的ES5方式(暂时忽略不同的this差异,但这里没有使用)看起来像这样:

const forbidden = function(message) {
   return function(req, res, next) {
       res.status(403).send(message);
   }
}
Run Code Online (Sandbox Code Playgroud)

因此,当您调用时forbidden(someMsg),您将获得可用作中间件的功能.

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

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

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

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

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

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


仅供参考,这条路线:

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

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