我有一个express后端应用程序。我遇到的问题是,所有路由都包含相同的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提供的默认错误中间件处理程序来用于prevent try catch every route
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);