我有一个快速后端应用程序。我遇到的问题是所有路由都包含相同的 try-catch 片段,这会导致我的程序中的代码膨胀:
// routes.js
router.get('/', async (req, res, next) => {
try {
const data = extractData(req)
await foo(data)
} catch (err) {
next(err)
}
})
// controllers.js
async function foo(data) {...do smh}
如上所示,
try { extractData() } catch (err) { next(err) }
部分代码存在于应用程序中定义的所有路由中。
我尝试创建一个包装函数,将控制器函数作为参数并将其用作:
// routes.js
router.get('/', controllerWrapper(req, res, next, foo))
// controller-wrapper.js
async function controllerWrapper(req, res, next, controllerFunc) {
try {
const data = extractData(req)
await controllerFunc(data)
} catch (err) {
next(err)
}
}
但这不起作用,因为函数被调用,并且实际上不是回调。
我怎样才能实现这个目标?
您应该为此使用闭包,这样您就可以从
controllerWrapper
返回中间件函数,并在返回的中间件中使用 controllerFunc
function controllerWrapper(controllerFunc) {
return async function (req, res, next) {
try {
const data = extractData(req)
await controllerFunc(data)
} catch (err) {
next(err)
}
}
}
router.get('/', controllerWrapper(foo))
您可以使用express提供的默认错误中间件处理程序来防止尝试捕获每个路由
const app: Application = express();
export function ResponseErrorHandler(error: any, req: Request, res: Response, next: NextFunction) {
res.status(500).send({ error: error.message });
}
app.get('/', (req, res, next) => {
throw new Error('Method not implemented.');
});
//app.use(router);
app.use(ResponseErrorHandler);