柯里化在中间件中核心作用是预绑定依赖(如db、logger),使中间件专注业务逻辑;实际常用的是部分应用而非严格柯里化,重在闭包封装依赖、提升复用与可测性。

柯里化在中间件场景中,核心作用是把依赖(比如数据库连接、配置对象、日志实例)提前绑定进函数,让后续中间件只关注业务逻辑,不操心“从哪拿资源”。它不是为了炫技,而是为了解耦和复用。
用柯里化预注入通用依赖
比如每个中间件都需要 db 实例和 logger,传统写法常在每个中间件里重复解构或 require;而用柯里化,可以把它们一次性绑定,生成“带上下文”的中间件工厂:
- 定义一个接受 db 和 logger 的高阶函数,返回真正的中间件
- 调用时传入实际依赖,得到一个已绑定好环境的中间件函数
- 这个函数签名就简化为
(req, res, next),完全符合 Express/Connect 规范
示例:
const createAuthMiddleware = (db, logger) => {
return async (req, res, next) => {
const token = req.headers.authorization;
try {
const user = await db.users.findByToken(token);
if (!user) throw new Error('Invalid token');
req.user = user;
logger.info(`User ${user.id} authenticated`);
next();
} catch (err) {
logger.error('Auth failed:', err);
res.status(401).json({ error: 'Unauthorized' });
}
};
};
// 提前绑定:一次注入,多处复用
const authMiddleware = createAuthMiddleware(pool, consoleLogger);
app.use(authMiddleware);
链式中间件中做参数分层传递
当多个中间件共享同一组配置(如 API 前缀、超时时间、租户 ID),可以用柯里化逐层固化参数,避免层层透传:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 第一层柯里化固定全局配置(如 baseURL、timeout)
- 第二层再固定业务级参数(如 tenantId)
- 最终产出的中间件只接收 req/res/next,内部自动使用已绑定的上下文
这样既保持中间件接口统一,又让配置可组合、可测试。
配合 next 实现可中断的执行流
柯里化本身不改变中间件执行机制,但它能让 next 调用更干净。例如封装一个带重试策略的中间件工厂:
- 柯里化函数接收 maxRetries 和 delayMs 作为预设参数
- 返回的中间件内部封装了重试逻辑,但对外仍遵循标准
next()流程 - 业务中间件无需知道重试细节,只需专注自身逻辑,调用
next()即可
这使得错误处理、降级、熔断等横切关注点能被抽象成可插拔的“增强型中间件”,而不是散落在各处的手动 if-else。
注意边界:柯里化 ≠ 部分应用
真实项目中容易混淆柯里化和部分应用。关键区别在于:
-
柯里化 是严格按参数顺序、每次只收一个参数,必须形成嵌套函数链(
f(a)(b)(c)) -
中间件预绑定 实际用的是部分应用——提前填入若干参数,返回一个新函数(
f(db, logger)→(req, res, next) => {...}) - 不必强求“单参数链”,重点是利用闭包保存依赖,让中间件变轻、变纯、易单元测试
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










