您好,我在我的節點打字稿應用程式中創建了一個自定義錯誤中間件處理程式
并收到錯誤訊息,即 ErrorRquestHandler 型別上不存在訊息
const errorHandler = (
err: ErrorRequestHandler,
_req: Request,
res: Response,
_next: NextFunction
) => {
const statusCode = res.statusCode === 200 ? 500 : res.statusCode;
res.status(statusCode);
res.json({
message: err.message,
stack: err.stack
})
}
我嘗試在我的 tsconfig.json 檔案中取消注釋“typeRoots”和“types”,但仍然出現相同的錯誤。
是什么導致了這個錯誤?謝謝
uj5u.com熱心網友回復:
看起來您有一個正確宣告的錯誤處理程式,但err引數的型別是錯誤的,相反,const errorHandler應該輸入它本身,ErrorRequestHandler以便推斷引數。
該型別在絕對型別ErrorRequestHandler中定義如下:
export type ErrorRequestHandler<
P = ParamsDictionary,
ResBody = any,
ReqBody = any,
ReqQuery = ParsedQs,
Locals extends Record<string, any> = Record<string, any>
> = (
err: any,
req: Request<P, ResBody, ReqBody, ReqQuery, Locals>,
res: Response<ResBody, Locals>,
next: NextFunction,
) => void;
建議您的代碼應如下所示:
const errorHandler: ErrorRequestHandler = (
err,
_req,
res,
_next
) => {
const statusCode = res.statusCode === 200 ? 500 : res.statusCode;
res.status(statusCode);
res.json({
message: err.message,
stack: err.stack
})
}
請注意,const errorHandler要鍵入的更改ErrorRequestHandler意味著您可以洗掉函式上顯式鍵入的引數(除非您啟用了需要它們的 tsconfig 選項)。確實注意到,現在err的型別是err: any感謝ErrorRequestHandler,你也許應該測驗,以確保它是一個錯誤首次使用前,err.message其也不能保證是一個型別的Error。編譯器將允許它,但是因為它的型別為any,為了安全起見,我建議您在使用屬性之前使用內置節點實用程式 api顯式測驗錯誤。
if (isNativeError(err)) {
// use err.message
} else {
// handle unexpected error
// or send generic unknown error response
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/359501.html
下一篇:從嵌套的物件陣列中洗掉物件
