【问题标题】:Javascript es6 - is it reassigning or a parameter?Javascript es6 - 它是重新分配还是参数?
【发布时间】:2017-02-23 04:26:36
【问题描述】:

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

【问题讨论】:

    标签: javascript node.js express ecmascript-6


    【解决方案1】:

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

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

    ES5 的编写方式(暂时忽略 this 的差异,这会有所不同,但此处未使用)如下所示:

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

    所以,当你调用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))
    

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

    【讨论】:

    • @AnnaGarcia - 我为您的更多问题添加了答案。
    • 非常感谢!我确实注意到关于禁止总是返回 403 并且想知道为什么但也忘了问这个问题,所以也感谢您回答这个问题哈哈。我想这一定是代码中的错误,因为它不是我写的。
    猜你喜欢
    • 2019-09-16
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 2010-11-11
    • 1970-01-01
    • 2017-04-28
    • 2018-08-01
    相关资源
    最近更新 更多