From aeb208162f278961283252c878ac902b63687091 Mon Sep 17 00:00:00 2001 From: Jerko Steiner Date: Sun, 4 Aug 2019 13:01:33 +0700 Subject: [PATCH] Refactor express#handleError --- packages/jsonrpc/src/express.test.ts | 1 - packages/jsonrpc/src/express.ts | 65 ++++++++++++++++------------ 2 files changed, 37 insertions(+), 29 deletions(-) diff --git a/packages/jsonrpc/src/express.test.ts b/packages/jsonrpc/src/express.test.ts index df3e0b5..d0a717d 100644 --- a/packages/jsonrpc/src/express.test.ts +++ b/packages/jsonrpc/src/express.test.ts @@ -91,7 +91,6 @@ describe('jsonrpc', () => { params: ['test'], }) .expect(500) - expect(response.body.id).toEqual(1) expect(response.body).toEqual({ jsonrpc: '2.0', id: 1, diff --git a/packages/jsonrpc/src/express.ts b/packages/jsonrpc/src/express.ts index 7a2b231..7d76bba 100644 --- a/packages/jsonrpc/src/express.ts +++ b/packages/jsonrpc/src/express.ts @@ -1,8 +1,11 @@ +import express, {ErrorRequestHandler} from 'express' import {FunctionPropertyNames} from './types' -import {NextFunction, Request, Response, Router} from 'express' -import {createRpcService, ERROR_SERVER, ERROR_INVALID_PARAMS} from './jsonrpc' -import {createError, isJSONRPCError, IJSONRPCError} from './error' import {IDEMPOTENT_METHOD_REGEX} from './idempotent' +import {IErrorResponse} from './jsonrpc' +import {ISuccessResponse} from './jsonrpc' +import {NextFunction, Request, Response, Router} from 'express' +import {createError, isJSONRPCError, IJSONRPCError, IError} from './error' +import {createRpcService, ERROR_SERVER, ERROR_INVALID_PARAMS} from './jsonrpc' export type TGetContext = (req: Request) => Context @@ -23,7 +26,10 @@ export function jsonrpc( const router = Router() - function handleResponse(response: any, res: Response) { + function handleResponse( + response: ISuccessResponse | null, + res: Response, + ) { if (response === null) { // notification res.status(204).send() @@ -58,31 +64,34 @@ export function jsonrpc( return router }, } -} -function handleError( - err: any, - req: Request, - res: Response, - next: NextFunction, -) { - const id = req.method === 'POST' ? req.body.id : req.query.id - // TODO log error - // TODO make this nicer + const handleError: ErrorRequestHandler = (err, req, res, next) => { + // TODO log error - const error: IJSONRPCError = isJSONRPCError(err) - ? err - : createError({ - code: ERROR_SERVER.code, - message: err.statusCode >= 400 && err.statusCode < 500 - ? err.message - : ERROR_SERVER.message, - }, { + if (isJSONRPCError(err)) { + res.status(err.statusCode) + res.json(err.response) + return + } + + const id = getRequestId(req) + const statusCode: number = err.statusCode || 500 + const errorResponse: IErrorResponse = { + jsonrpc: '2.0', id, - data: null, - statusCode: err.statusCode || 500, - }) - - res.status(error.statusCode) - res.json(error.response) + result: null, + error: { + code: ERROR_SERVER.code, + message: statusCode >= 500 ? ERROR_SERVER.message : err.message, + data: 'errors' in err ? err.errors : null, + }, + } + res.status(statusCode) + res.json(errorResponse) + } +} + +function getRequestId(req: express.Request) { + const id = req.method === 'POST' ? req.body.id : req.query.id + return id !== undefined ? id : null }