gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:27:52 24 4
gpt4 key购买 nike

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

我理解 mustBeLoggedIn 的 es6 语法,但我不确定 const forbidden = message => (req, res, next) => { 在做什么。 message 是 req、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))

最佳答案

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

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

写这个的 ES5 方式(暂时忽略 this 的区别,它会有所不同,但这里没有使用)看起来像这样:

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

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

If so, why isn't it in the parenthesis?

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

Another interesting thing I noticed is that the middleware forbidden is being invoked in the get request

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

and mustBeLoggedIn is only being passed and not invoked. Why?

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


仅供引用,这条路线:

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

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

关于Javascript es6 - 它是重新分配还是参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42407039/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com