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'],
})
.expect(500)
expect(response.body.id).toEqual(1)
expect(response.body).toEqual({
jsonrpc: '2.0',
id: 1,

View File

@ -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<Context> = (req: Request) => Context
@ -23,7 +26,10 @@ export function jsonrpc<Context>(
const router = Router()
function handleResponse(response: any, res: Response) {
function handleResponse(
response: ISuccessResponse<unknown> | null,
res: Response,
) {
if (response === null) {
// notification
res.status(204).send()
@ -58,31 +64,34 @@ export function jsonrpc<Context>(
return router
},
}
}
function handleError(
err: any,
req: Request,
res: Response,
next: NextFunction,
) {
const id = req.method === 'POST' ? req.body.id : req.query.id
const handleError: ErrorRequestHandler = (err, req, res, next) => {
// TODO log error
// TODO make this nicer
const error: IJSONRPCError<unknown> = 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<unknown> = {
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
}