Refactor express#handleError

This commit is contained in:
Jerko Steiner 2019-08-04 13:01:33 +07:00
parent e6a98bb450
commit aeb208162f
2 changed files with 37 additions and 29 deletions

View File

@ -91,7 +91,6 @@ describe('jsonrpc', () => {
params: ['test'], params: ['test'],
}) })
.expect(500) .expect(500)
expect(response.body.id).toEqual(1)
expect(response.body).toEqual({ expect(response.body).toEqual({
jsonrpc: '2.0', jsonrpc: '2.0',
id: 1, id: 1,

View File

@ -1,8 +1,11 @@
import express, {ErrorRequestHandler} from 'express'
import {FunctionPropertyNames} from './types' 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 {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<Context> = (req: Request) => Context export type TGetContext<Context> = (req: Request) => Context
@ -23,7 +26,10 @@ export function jsonrpc<Context>(
const router = Router() const router = Router()
function handleResponse(response: any, res: Response) { function handleResponse(
response: ISuccessResponse<unknown> | null,
res: Response,
) {
if (response === null) { if (response === null) {
// notification // notification
res.status(204).send() res.status(204).send()
@ -58,31 +64,34 @@ export function jsonrpc<Context>(
return router return router
}, },
} }
}
function handleError( const handleError: ErrorRequestHandler = (err, req, res, next) => {
err: any,
req: Request,
res: Response,
next: NextFunction,
) {
const id = req.method === 'POST' ? req.body.id : req.query.id
// TODO log error // TODO log error
// TODO make this nicer
const error: IJSONRPCError<unknown> = isJSONRPCError(err) if (isJSONRPCError(err)) {
? err res.status(err.statusCode)
: createError({ res.json(err.response)
code: ERROR_SERVER.code, return
message: err.statusCode >= 400 && err.statusCode < 500 }
? err.message
: ERROR_SERVER.message, const id = getRequestId(req)
}, { const statusCode: number = err.statusCode || 500
const errorResponse: IErrorResponse<unknown> = {
jsonrpc: '2.0',
id, id,
data: null, result: null,
statusCode: err.statusCode || 500, error: {
}) code: ERROR_SERVER.code,
message: statusCode >= 500 ? ERROR_SERVER.message : err.message,
res.status(error.statusCode) data: 'errors' in err ? err.errors : null,
res.json(error.response) },
}
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
} }