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)
我不喜欢使用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()有逻辑来检查当前用户是否真的是管理员(你没有显示),这对我来说才有意义.
| 归档时间: |
|
| 查看次数: |
114 次 |
| 最近记录: |