javascript - 解释箭头运算符系列

标签 javascript express ecmascript-6

<分区>

我有一个包含以下代码的文件:

const logger = (options) => (req, res, next) => {
  if (typeof options === 'object'
      && options !== null
      && options.enable) {
        console.log(
          'Status Code:', res.statusCode,
          'URL:', req.originalUrl,
        )
  }
  next()
}

module.exports = logger

它在不同的 .js 文件中这样使用:

const express = require('express')
const loggerMiddleware = require('./middleware-logger')
const app = express()

app.use(loggerMiddleware({
        enable: true,
}))

app.listen(
    1337,
    () => console.log('Web Server listening on 1337'),
)

谁能解释一下第一行中的 => 系列发生了什么?我理解正常的 (req,res,next) => {} 意思是这样的:

“有一个未命名的函数,它有 3 个参数,由大括号中的内容定义。

在使用箭头运算符系列的这种情况下,我没有“理解”的是函数 def 如何可以同时看到 (options) 和 (req,res,next) 中的所有参数。

幕后到底发生了什么?这与 promise 有关吗?同样,一个方法 def 怎么能同时看到所有参数?

最佳答案

您显示的代码是以下内容的简写:

const logger = function(options) {
  return function(req, res, next) {
    if (typeof options === 'object' &&
      options !== null &&
      options.enable) {
      console.log(
        'Status Code:', res.statusCode,
        'URL:', req.originalUrl,
      )
    }
    next()
  }
}

如果您调用 loggerMiddleware({enable: true,}) 它将返回一个新函数 function(req, res, next) { ... } 创建options 参数的闭包。

这允许此返回函数(在本例中为中间件)可以访问每个请求中传递的选项对象,而无需污染全局范围。

从那时起,还允许创建两个具有不同选项的中间件:

app.get('/with-logging', loggerMiddleware({
  enable: true,
}), function(res, res) {})


app.get('/without-logging', loggerMiddleware({
  enable: false,
}), function(res, res) {})

我个人认为那些 (options) => (req, res, next) => { 结构不是真正可读的,让我想起那些花哨的嵌套三元条件运算符 (?: ) 组合。

关于javascript - 解释箭头运算符系列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52280939/

相关文章:

javascript - 我想在 fullcalendar 3.0.1 中动态显示事件

javascript - 尝试使用函数组合时出现 ReferenceError : error is not defined,

javascript - 使用服务器路由 react 路由器浏览器历史记录

javascript - 使用 Node.js 抓取 JavaScript 生成的网站

javascript - 根据另一个数组中存在的值向对象数组添加属性

javascript - 函数组件不能有引用。您的意思是使用 React.forwardRef() 吗?

javascript - 为什么我的 bootstrap Accordion 图标在展开/折叠时没有改变?

javascript - 来自javascript的全屏

import - 扩展 Quill 时遇到问题

node.js - 使用 @std/esm 在 Express Node.js 项目中使用 ES6