Express -用try-catch包装控制器函数



我有一个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);

相关内容

  • 没有找到相关文章

最新更新