我在 GitHub 上瀏覽 Express 服務器的一些代碼示例,遇到了這個用于包裝 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 控制器回呼。但是,catchError 的下一部分說
return async (req, res, next): Promise<any> => {...}
this (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
uj5u.com熱心網友回復:
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 中間件。看看高階函式、裝飾器模式和閉包,它們是相同的概念。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/475478.html
標籤:javascript 节点.js 打字稿 休息 表示
