Express - 使用 try-catch 包装控制器功能

问题描述 投票:0回答:2

我有一个快速后端应用程序。我遇到的问题是所有路由都包含相同的 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)
  }
}

但这不起作用,因为函数被调用,并且实际上不是回调。

我怎样才能实现这个目标?

node.js express try-catch
2个回答
1
投票

您应该为此使用闭包,这样您就可以从

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))

0
投票

您可以使用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);
© www.soinside.com 2019 - 2024. All rights reserved.