javascript - 这个接受 Express 中的 RequestHandler 的函数是如何工作的?

标签 javascript node.js typescript rest express

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

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 Controller 以捕获错误并将其传递到错误处理中间件。此类用法的一个简短示例如下:

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 Controller 回调。然而,catchError 的下一部分说 return async (req, res, next): Promise<any> => {...} 这个 (req, res, next) 从哪里来?我尝试控制台记录 req.body原来是上面解析的requestHandler参数的请求体。我不明白如何以这种方式引用 requestHandler 的 (req, res, next) 而不是 requestHandler.req (这不起作用)?

我在其中找到此代码的 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 function , decorator patternclosures这是相同的概念。

关于javascript - 这个接受 Express 中的 RequestHandler 的函数是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72217932/

相关文章:

javascript - 第一个 <> 括号内是什么

javascript - 通过 yield & co 获得 promise 的值(value)

javascript - 无法在场景中获取 object3D

javascript - 正则表达式将 & 转换为 &

javascript - .data,信息以 NaN 的形式传递?

node.js - 我正在尝试从 DynamoDB 表获取各个属性,并在回调之前将它们转换为变量

javascript - Mocha 测试的 Istanbul 尔代码覆盖率

TypeScript:为什么我不能分配类型为 { a: "a", b: "b"} 的对象的有效字段

typescript - 如何使用 DebugSession.customRequest 运行任意 gdb 命令并获取结果

typescript : 'RegExpMatchArray' 类型的参数不可分配给 'string' 类型的参数