有人可以解释一下这里发生了什么吗?我知道这些是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))

答案 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()
有逻辑来检查当前用户是否真的是管理员(你不会显示)时,这才对我有意义。