Refactor express#handleError
This commit is contained in:
parent
e6a98bb450
commit
aeb208162f
@ -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,
|
||||||
|
|||||||
@ -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
|
||||||
id,
|
const errorResponse: IErrorResponse<unknown> = {
|
||||||
data: null,
|
jsonrpc: '2.0',
|
||||||
statusCode: err.statusCode || 500,
|
id,
|
||||||
})
|
result: null,
|
||||||
|
error: {
|
||||||
res.status(error.statusCode)
|
code: ERROR_SERVER.code,
|
||||||
res.json(error.response)
|
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
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user