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理员或不(你不显示)。