如何在Node.js中调用每个控制器时自动执行指定函数?
实现控制器调用时自动执行test函数的方法
问题场景
在Node.js中定义了如下test函数与3个控制器函数:
function test() {console.log("controller called")} controller1 = (req,res)=>{} controller2 = (req,res)=>{} controller3 = (req,res)=>{}
需求:当任一控制器被调用时自动执行test函数,且无需在控制器内部编写调用代码,请问实现方法是什么?
可行实现方法
1. 高阶函数包装控制器
创建一个通用包装函数,接收原控制器作为参数,返回的新函数会先执行test,再调用原控制器逻辑。这种方式不修改原控制器代码,仅通过包装实现需求。
示例代码:
function test() {console.log("controller called")} // 定义通用包装函数 function withTest(controller) { return (req, res) => { test(); // 优先执行test return controller(req, res); // 执行原控制器逻辑 }; } // 原控制器函数 const controller1 = (req, res) => { res.send('来自控制器1的响应'); }; const controller2 = (req, res) => { res.send('来自控制器2的响应'); }; const controller3 = (req, res) => { res.send('来自控制器3的响应'); }; // 生成包装后的控制器 const wrappedController1 = withTest(controller1); const wrappedController2 = withTest(controller2); const wrappedController3 = withTest(controller3);
之后在路由配置中使用wrappedController1这类包装后的函数即可,每次调用都会自动触发test。
2. 批量包装控制器
如果控制器数量较多,可以将所有控制器存入一个对象,通过遍历批量完成包装,避免重复代码:
function test() {console.log("controller called")} // 集中存放所有原控制器 const rawControllers = { controller1: (req, res) => res.send('来自控制器1的响应'), controller2: (req, res) => res.send('来自控制器2的响应'), controller3: (req, res) => res.send('来自控制器3的响应') }; // 批量生成带test逻辑的控制器 const wrappedControllers = Object.fromEntries( Object.entries(rawControllers).map(([key, ctrl]) => [ key, (req, res) => { test(); return ctrl(req, res); } ]) ); // 使用时直接调用 wrappedControllers.controller1 即可
3. Express框架下用中间件实现
如果项目基于Express框架,可通过自定义中间件实现全局或路由级的test自动执行:
const express = require('express'); const app = express(); function test() {console.log("controller called")} // 定义触发test的中间件 const testMiddleware = (req, res, next) => { test(); next(); // 调用next()让请求继续流向控制器 }; // 给指定路由绑定中间件 app.get('/path1', testMiddleware, (req, res) => { res.send('来自控制器1的响应'); }); // 若要全局生效(所有路由调用都触发test),可使用全局中间件 // app.use(testMiddleware);
内容的提问来源于stack exchange,提问作者Yusuf Eren
相关产品推荐
相关产品推荐

