Skip to content

Commit dc543c4

Browse files
committed
Prevent TypeError when API returns error responses
Improvements: DX-1182 Previously, when the API returned non-404 error responses (401, 500, etc.), the code would attempt to call .map() on the error object, resulting in: "TypeError: responseBody.map is not a function" Changes: - Add validation for HTTP status codes before processing response - Check if responseBody is an array before calling .map() - Extract and include error details from API error responses - Provide clear, actionable error messages Example error messages: - "Failed to fetch revisions (HTTP 401): unauthorized" - "Expected array of revisions, but got object: {...}" This fix addresses transient API failures and authentication issues that previously resulted in cryptic TypeErrors.
1 parent 445830d commit dc543c4

1 file changed

Lines changed: 28 additions & 2 deletions

File tree

lib/rest-client.js

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,11 +109,37 @@ module.exports = CoreObject.extend({
109109
}
110110

111111
return denodeify(this._request.get)({ uri, qs: qs }).then(function (response) {
112+
// Handle 404 as empty revision list
113+
if (response.statusCode == 404) {
114+
return [];
115+
}
116+
117+
// Handle non-2xx status codes
118+
if (response.statusCode < 200 || response.statusCode >= 300) {
119+
var errorMessage = 'Failed to fetch revisions (HTTP ' + response.statusCode + ')';
120+
121+
// Try to extract error details from response body
122+
if (response.body && response.body.errors && Array.isArray(response.body.errors)) {
123+
var errorDetails = response.body.errors.map(function(err) {
124+
return err.detail || err.message || JSON.stringify(err);
125+
}).join(', ');
126+
errorMessage += ': ' + errorDetails;
127+
} else if (response.body && typeof response.body === 'object') {
128+
errorMessage += ': ' + JSON.stringify(response.body);
129+
}
130+
131+
return Promise.reject(new Error(errorMessage));
132+
}
133+
112134
var responseBody =
113135
useReleaseEndpoint && isSummaryEndpoint ? response.body.filter((rev) => rev.app === appName) : response.body;
114136

115-
if (response.statusCode == 404) {
116-
return [];
137+
// Validate that responseBody is an array
138+
if (!Array.isArray(responseBody)) {
139+
var bodyType = responseBody === null ? 'null' : typeof responseBody;
140+
return Promise.reject(
141+
new Error('Expected array of revisions, but got ' + bodyType + ': ' + JSON.stringify(responseBody))
142+
);
117143
}
118144

119145
return responseBody.map(function (revision) {

0 commit comments

Comments
 (0)