@@ -8,14 +8,36 @@ import { rootPath } from "../constants"
8
8
import { replaceTemplates } from "../http"
9
9
import { escapeHtml , getMediaMime } from "../util"
10
10
11
- const notFoundCodes = [ "ENOENT" , "EISDIR" ]
11
+ interface ErrorWithStatusCode {
12
+ statusCode : number
13
+ }
14
+
15
+ interface ErrorWithCode {
16
+ code : string
17
+ }
18
+
19
+ /** Error is network related. */
20
+ export const errorHasStatusCode = ( error : any ) : error is ErrorWithStatusCode => {
21
+ return error && "statusCode" in error
22
+ }
23
+
24
+ /** Error originates from file system. */
25
+ export const errorHasCode = ( error : any ) : error is ErrorWithCode => {
26
+ return error && "code" in error
27
+ }
28
+
29
+ const notFoundCodes = [ 404 , "ENOENT" , "EISDIR" ]
30
+
12
31
export const errorHandler : express . ErrorRequestHandler = async ( err , req , res , next ) => {
13
- if ( notFoundCodes . includes ( err . code ) ) {
14
- err . status = HttpCode . NotFound
32
+ let statusCode = 500
33
+
34
+ if ( errorHasStatusCode ( err ) ) {
35
+ statusCode = err . statusCode
36
+ } else if ( errorHasCode ( err ) && notFoundCodes . includes ( err . code ) ) {
37
+ statusCode = HttpCode . NotFound
15
38
}
16
39
17
- const status = err . status ?? err . statusCode ?? 500
18
- res . status ( status )
40
+ res . status ( statusCode )
19
41
20
42
// Assume anything that explicitly accepts text/html is a user browsing a
21
43
// page (as opposed to an xhr request). Don't use `req.accepts()` since
@@ -27,8 +49,8 @@ export const errorHandler: express.ErrorRequestHandler = async (err, req, res, n
27
49
const content = await fs . readFile ( resourcePath , "utf8" )
28
50
res . send (
29
51
replaceTemplates ( req , content )
30
- . replace ( / { { ERROR_ T I T L E } } / g, status )
31
- . replace ( / { { ERROR_ H E A D E R } } / g, status )
52
+ . replace ( / { { ERROR_ T I T L E } } / g, statusCode . toString ( ) )
53
+ . replace ( / { { ERROR_ H E A D E R } } / g, statusCode . toString ( ) )
32
54
. replace ( / { { ERROR_ B O D Y } } / g, escapeHtml ( err . message ) ) ,
33
55
)
34
56
} else {
0 commit comments