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

FieldDB / AuthenticationWebService / 20031977515

08 Dec 2025 02:42PM UTC coverage: 74.356% (-2.0%) from 76.331%
20031977515

push

github

web-flow
Merge pull request #122 from FieldDB/remove_oauth_provider

Remove oauth provider

479 of 714 branches covered (67.09%)

Branch coverage included in aggregate %.

1052 of 1345 relevant lines covered (78.22%)

7.39 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');
1✔
2

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

5
function cleanErrorStatus(status) {
6
  if (status && status < 600) {
48✔
7
    return status;
45✔
8
  }
9
  return '';
3✔
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;
48✔
16
  debug(`errorHandler ${NODE_ENV} ${req.url}`, err);
48✔
17

18
  if (res.headersSent) {
48!
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) {
48✔
25
    // expose stack traces
26
    data = {
46✔
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) {
46!
34
      delete data.details.url;
×
35
    }
36
  } else {
37
    // production error handler
38
    debug('using production error handler', NODE_ENV);
2✔
39
    data = {
2✔
40
      message: err.message,
41
    };
42
  }
43
  data.status = cleanErrorStatus(err.statusCode || err.status) || 500;
48✔
44

45
  if (err.code === 'ECONNREFUSED') {
48!
46
    data.userFriendlyErrors = ['Server erred, please report this 6339'];
×
47
  } else if (err.name === 'unauthorized_request') {
48!
48
    data.status = 401;
×
49
    data.userFriendlyErrors = err.userFriendlyErrors || [data.message];
×
50
  } else if (err.code === 'ETIMEDOUT') {
48!
51
    data.status = 500;
×
52
    data.userFriendlyErrors = ['Server timed out, please try again later'];
×
53
  } else if (data.status === 502) {
48!
54
    data.userFriendlyErrors = ['Server erred, please report this 36339'];
×
55
  } else if (data.status === 401) {
48✔
56
    data.userFriendlyErrors = err.userFriendlyErrors || ['Server erred, please report this 7234'];
9!
57
  } else if (data.status === 404) {
39✔
58
    data.userFriendlyErrors = err.userFriendlyErrors || [data.message];
2✔
59
  } else if (data.status === 403) {
37!
60
    data.userFriendlyErrors = err.userFriendlyErrors || [data.message];
×
61
  } else if (data.status === 406) {
37✔
62
    data.userFriendlyErrors = err.userFriendlyErrors || [data.message];
4✔
63
  } else if (data.status === 409) {
33✔
64
    data.userFriendlyErrors = err.userFriendlyErrors || [data.message];
20✔
65
  } else if (data.status === 412) {
13✔
66
    data.userFriendlyErrors = err.userFriendlyErrors || [data.message];
8✔
67
  } else if (err.message === 'Code is not authorized') {
5!
68
    data.status = 403;
×
69
    data.userFriendlyErrors = err.userFriendlyErrors || [data.message];
×
70
  } else if (err.message === 'Missing parameter: `state`') {
5!
71
    data.userFriendlyErrors = err.userFriendlyErrors || [data.message];
×
72
  } else if (err.message === 'Client id or Client Secret is invalid') {
5!
73
    data.status = 403;
×
74
    data.userFriendlyErrors = err.userFriendlyErrors || [data.message];
×
75
  } else if (err.code === 'ENOTFOUND' && err.syscall === 'getaddrinfo') {
5!
76
    data.status = 500;
×
77
    data.userFriendlyErrors = ['Server connection timed out, please try again later'];
×
78
  } else if (err.code === 'EPROTO') {
5!
79
    data.userFriendlyErrors = ['Server erred, please report this 9234'];
×
80
  } else if (err.code === 'DEPTH_ZERO_SELF_SIGNED_CERT') {
5!
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')) {
5!
84
    data.userFriendlyErrors = err.userFriendlyErrors;
×
85
  } else if (err.userFriendlyErrors) {
5✔
86
    data.userFriendlyErrors = err.userFriendlyErrors;
1✔
87
  } else {
88
    data.userFriendlyErrors = ['Server erred, please report this 816'];
4✔
89
  }
90

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

93
  if (data.status >= 500) {
48✔
94
    // data.stack = data.stack ? data.stack.toString() : undefined;
95
    data.message = 'Internal server error';
5✔
96
    if (BUNYAN_LOG_LEVEL !== 'FATAL') {
5!
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;
43✔
101
  }
102
  req.log.fields.err = {
48✔
103
    stack: err.stack, message: err.message,
104
  };
105

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

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

117
exports.errorHandler = errorHandler;
1✔
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

© 2025 Coveralls, Inc