我浏览了GitHub上Express server的一些代码示例,发现这个函数用于包装REST API控制器,对它的工作原理感到困惑...

import { RequestHandler } from 'express';

export const catchErrors = (requestHandler: RequestHandler): RequestHandler => {
  return async (req, res, next): Promise<any> => {
    try {
      console.log(req.body) **// returns requestHandler's req parameter //**

      return await requestHandler(req, res, next);
    } catch (error) {
      next(error);
    }
  };
};

它用于围绕REST API控制器捕获错误,并将其传递到错误处理中间件.这种用法的一个简单例子是:

import {catchErrors} from './error'
export const fetchData = catchErrors(async (req: Request, res: Response) => {
  /// perform data fetching here ///
  return res.status(200).send()

})

我对catchErrors函数的工作原理感到困惑.据我所知,requestHandler参数指的是原始的REST控制器回调.然而,下一部分的内容是

我在GitHub链接中找到了这个代码:https://github.com/oldboyxx/jira_clone/blob/master/api/src/errors/asyncCatch.ts

推荐答案

catchErrors只是一个帮助函数,用于从另一个中间件函数返回一个中间件函数,从而增强或添加功能.在你的情况下,把fetchData想象成

 async (req, res, next): Promise<any> => {
    try {
      console.log(req.body) **// returns requestHandler's req parameter //**

      const fetchFunction = async (req: Request, res: Response) => {
           /// perform data fetching here ///
           return res.status(200).send()

      }
      return await fetchFunction(req, res, next);
    } catch (error) {
      next(error);
    }
  };


这是express的有效中间件.看看higher order functiondecorator patternclosures,它们是相同的概念.

Javascript相关问答推荐

如何在表格上拥有水平滚动条,在正文页面上拥有垂直滚动条,同时还对html表格的标题使用位置粘性?

我试图实现用户验证的reduxstore 和操作中出了什么问题?

从PWA中的内部存储读取文件

使用复选框在d3.js多折线图中添加或删除线条

. NET中Unix时间转换为日期时间的奇怪行为

在vercel throws上部署带有gunjs的sveltekit应用无法找到模块./' lib/文本编码'

如何修复(或忽略)HTML模板中的TypeScript错误?'

如何在coCos2d-x中更正此错误

使用类型:assets资源 /资源&时,webpack的配置对象&无效

更改agGRID/Reaction中的单元格格式

JAVASCRIPT SWITCH CASE语句:当表达式为';ALL';

如果对象中的字段等于某个值,则从数组列表中删除对象

FindByIdAndUpdate在嵌套对象中创建_id

未捕获的不变违规:即使在使用DndProvider之后也应使用拖放上下文

有角粘桌盒阴影

使用props 将VUE 3组件导入JS文件

使用jQuery每隔几秒钟突出显示列表中的不同单词

在JS/TS中构造RSA公钥

Html/JS:如何在脚本执行前阻止呈现?

在使用Jest进行测试时,在Express应用程序中未定义Multer