• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

FieldDB / AuthenticationWebService / 19976179332

05 Dec 2025 09:14PM UTC coverage: 74.356% (-2.0%) from 76.331%
19976179332

Pull #122

github

web-flow
Merge 7b9add3b1 into c92b5f5d9
Pull Request #122: Remove oauth provider

479 of 714 branches covered (67.09%)

Branch coverage included in aggregate %.

1052 of 1345 relevant lines covered (78.22%)

22.16 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

67.52
/middleware/error-handler.js
1
const debug = require('debug')('middleware:error');
3✔
2

3
const { BUNYAN_LOG_LEVEL } = process.env;
3✔
4

5
function cleanErrorStatus(status) {
6
  if (status && status < 600) {
144✔
7
    return status;
135✔
8
  }
9
  return '';
9✔
10
}
11

12
// eslint-disable-next-line no-unused-vars
13
function errorHandler(err, req, res, next) {
14
  let data;
15
  const { NODE_ENV } = process.env;
144✔
16
  debug(`errorHandler ${NODE_ENV} ${req.url}`, err);
144✔
17

18
  if (res.headersSent) {
144!
19
    // eslint-disable-next-line no-console
20
    console.warn('This request has already been replied to', err);
×
21
    return;
×
22
  }
23

24
  if (['development', 'test', 'local'].indexOf(NODE_ENV) > -1) {
144✔
25
    // expose stack traces
26
    data = {
138✔
27
      message: err.message,
28
      stack: err.stack,
29
      url: err.url,
30
      details: err.details,
31
      userFriendlyErrors: err.userFriendlyErrors,
32
    };
33
    if (data.details && data.details.url) {
138!
34
      delete data.details.url;
×
35
    }
36
  } else {
37
    // production error handler
38
    debug('using production error handler', NODE_ENV);
6✔
39
    data = {
6✔
40
      message: err.message,
41
    };
42
  }
43
  data.status = cleanErrorStatus(err.statusCode || err.status) || 500;
144✔
44

45
  if (err.code === 'ECONNREFUSED') {
144!
46
    data.userFriendlyErrors = ['Server erred, please report this 6339'];
×
47
  } else if (err.name === 'unauthorized_request') {
144!
48
    data.status = 401;
×
49
    data.userFriendlyErrors = err.userFriendlyErrors || [data.message];
×
50
  } else if (err.code === 'ETIMEDOUT') {
144!
51
    data.status = 500;
×
52
    data.userFriendlyErrors = ['Server timed out, please try again later'];
×
53
  } else if (data.status === 502) {
144!
54
    data.userFriendlyErrors = ['Server erred, please report this 36339'];
×
55
  } else if (data.status === 401) {
144✔
56
    data.userFriendlyErrors = err.userFriendlyErrors || ['Server erred, please report this 7234'];
27!
57
  } else if (data.status === 404) {
117✔
58
    data.userFriendlyErrors = err.userFriendlyErrors || [data.message];
6✔
59
  } else if (data.status === 403) {
111!
60
    data.userFriendlyErrors = err.userFriendlyErrors || [data.message];
×
61
  } else if (data.status === 406) {
111✔
62
    data.userFriendlyErrors = err.userFriendlyErrors || [data.message];
12✔
63
  } else if (data.status === 409) {
99✔
64
    data.userFriendlyErrors = err.userFriendlyErrors || [data.message];
60✔
65
  } else if (data.status === 412) {
39✔
66
    data.userFriendlyErrors = err.userFriendlyErrors || [data.message];
24✔
67
  } else if (err.message === 'Code is not authorized') {
15!
68
    data.status = 403;
×
69
    data.userFriendlyErrors = err.userFriendlyErrors || [data.message];
×
70
  } else if (err.message === 'Missing parameter: `state`') {
15!
71
    data.userFriendlyErrors = err.userFriendlyErrors || [data.message];
×
72
  } else if (err.message === 'Client id or Client Secret is invalid') {
15!
73
    data.status = 403;
×
74
    data.userFriendlyErrors = err.userFriendlyErrors || [data.message];
×
75
  } else if (err.code === 'ENOTFOUND' && err.syscall === 'getaddrinfo') {
15!
76
    data.status = 500;
×
77
    data.userFriendlyErrors = ['Server connection timed out, please try again later'];
×
78
  } else if (err.code === 'EPROTO') {
15!
79
    data.userFriendlyErrors = ['Server erred, please report this 9234'];
×
80
  } else if (err.code === 'DEPTH_ZERO_SELF_SIGNED_CERT') {
15!
81
    // see also https://github.com/request/request/issues/418
82
    data.userFriendlyErrors = ['Server erred, please report this 23829'];
×
83
  } else if (err.status && err.userFriendlyErrors && err.userFriendlyErrors[0] && err.userFriendlyErrors[0].includes('Please report this')) {
15!
84
    data.userFriendlyErrors = err.userFriendlyErrors;
×
85
  } else if (err.userFriendlyErrors) {
15✔
86
    data.userFriendlyErrors = err.userFriendlyErrors;
3✔
87
  } else {
88
    data.userFriendlyErrors = ['Server erred, please report this 816'];
12✔
89
  }
90

91
  res.status(data.status);
144✔
92

93
  if (data.status >= 500) {
144✔
94
    // data.stack = data.stack ? data.stack.toString() : undefined;
95
    data.message = 'Internal server error';
15✔
96
    if (BUNYAN_LOG_LEVEL !== 'FATAL') {
15!
97
      req.log.error(err, `${new Date()} There was an unexpected error ${process.env.NODE_ENV} ${req.url}`);
×
98
    }
99
  } else {
100
    data.message = err.message;
129✔
101
  }
102
  req.log.fields.err = {
144✔
103
    stack: err.stack, message: err.message,
104
  };
105

106
  if (req.headers['x-requested-with'] === 'XMLHttpRequest' || /application\/json/.test(req.headers['content-type'])) {
144✔
107
    res.json(data);
141✔
108
    return;
141✔
109
  }
110

111
  res.json({
3✔
112
    status: data.status,
113
    userFriendlyErrors: data.userFriendlyErrors,
114
  });
115
}
116

117
exports.errorHandler = errorHandler;
3✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc