快速路线的高阶功能

时间:2018-08-30 17:07:16

标签: node.js typescript express

我正在看一个博客https://www.acuriousanimal.com/2018/02/15/express-async-middleware.html,该博客介绍如何处理Typescript Express路由中的等待/异步操作。

我喜欢使用高阶函数来避免代码冗余的想法,但是

  1. 我不确定如何在TypeScript中进行操作

  2. TypeScript针对这种情况还有其他更好的建议

示例代码段: https://gist.github.com/kameshsampath/e550d5bf19feb9b59d0ec1871e59b53a

1 个答案:

答案 0 :(得分:0)

我相信您希望将以下代码中的catch删除为高阶函数:

app.get("/api/frames", async (req: Request, res: Response, next: any) => {
  //TODO move this to higher order function
  try {
    const qCollection = await loadCollection("frames", db);
    const docs = qCollection.find();
    if (docs) {
      return res
        .contentType("json")
        .status(200)
        .send(docs);
    }
  } catch (err) {
    res.status(404).send(err);
  }
    app.get("/api/frames", async (req: Request, res: Response, next: any) => {
  //TODO move this to higher order function
  try {
    const qCollection = await loadCollection("frames", db);
    const docs = qCollection.find();
    if (docs) {
      return res
        .contentType("json")
        .status(200)
        .send(docs);
    }
  } catch (err) {
    res.status(404).send(err);
  }
});

这样做:

const asyncHandler = fn => (req, res, next) =>
  Promise
    .resolve(fn(req, res, next))
    .catch((err)=>res.status(404).send(err);)

app.get("/api/frames", asyncHandler(async (req: Request, res: Response, next: any) => {
    const qCollection = await loadCollection("frames", db);
    const docs = qCollection.find();
    if (docs) {
      return res
        .contentType("json")
        .status(200)
        .send(docs);
    }
 }));