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

FieldDB / AuthenticationWebService / 19936984472

04 Dec 2025 04:56PM UTC coverage: 24.852% (-51.5%) from 76.331%
19936984472

push

github

web-flow
Merge pull request #100 from FieldDB/upgrade/couchdb

upgrade couchdb to 3.1.2

119 of 963 branches covered (12.36%)

Branch coverage included in aggregate %.

595 of 1910 relevant lines covered (31.15%)

0.66 hits per line

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

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

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

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

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

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

91
  res.status(data.status);
×
92

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

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

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

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