我有一个具有以下代码的文件:
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'),
)
有人能解释第一行中的=>系列发生了什么吗?我理解normal(req,res,next)=>{}的意思如下:
您所显示的代码是以下代码的简写:
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,})
,它将返回一个新函数函数(req,res,next){...}
,该函数在options
参数上创建闭包。
这允许返回的函数(在本例中是中间件)在每个请求上访问传递的option对象,而不需要污染全局范围。
app.get('/with-logging', loggerMiddleware({
enable: true,
}), function(res, res) {})
app.get('/without-logging', loggerMiddleware({
enable: false,
}), function(res, res) {})
更新/答案:原来IntelliJ12支持Java 8,后者支持lambda,并且正在“折叠”谓词并将其显示为lambda。下面是“未折叠”代码。
问题内容: 在浏览一些代码时,我遇到了箭头运算符,它究竟是做什么的?我以为Java没有箭头运算符。 详细信息:Java 6,Apache Commons Collection,IntelliJ 12 更新/答案:事实证明IntelliJ 12支持Java 8,后者支持lambda,并且正在“折叠”谓词并将其显示为lambda。下面是“展开”代码。 问题答案: 这是将在Java 8中引入的新lamb
C++ 重载运算符和重载函数 C++ 语言支持各种关系运算符( < 、 > 、 <= 、 >= 、 == 等等),它们可用于比较 C++ 内置的数据类型。 您可以重载任何一个关系运算符,重载后的关系运算符可用于比较类的对象。 下面的实例演示了如何重载 < 运算符,类似地,您也可以尝试重载其他的关系运算符。 #include <iostream> using namespace std; cl
关系运算符(relational operators)也可以称为“比较运算符”,用于用来比较判断两个变量或常量的大小。 关系运算符是二元运算符,运算结果是 boolean 型。当运算符对应的关系成立时,运算结果是 true,否则是 false。 关系表达式是由关系运算符连接起来的表达式。关系运算符中“关系”二字的含义是指一个数据与另一个数据之间的关系,这种关系只有成立与不成立两种可能情况,可以用逻