Initial commit

master
Sven Slootweg 5 years ago
commit 2bfd0976fb

1
.gitignore vendored

@ -0,0 +1 @@
node_modules

@ -0,0 +1,101 @@
# axios-get-json-response
A simple utility for checking status codes and parsing JSON data from Axios responses. While Axios *can* do this by itself, it doesn't document any distinguishable error types, and so when an error occurs you can never know *what* went wrong.
This library fixes that, by giving you two distinct error types. Hopefully this functionality eventually makes it into Axios itself.
Both error types correctly inherit from Error, and therefore a) have stacktraces, and b) can be used with `instanceof` as well as things based on it, like Bluebird's [filtered `.catch`](http://bluebirdjs.com/docs/api/catch.html#filtered-catch).
## Examples
An existent and valid URL:
```js
"use strict";
const axios = require("axios");
const Promise = require("bluebird");
const getJson = require("axios-get-json-response");
Promise.try(() => {
return axios.get("http://cryto.net/test.json", getJson.axiosConfiguration); // {"hello": "world"}
}).then((response) => {
let parsedJson = getJson.parse(response);
console.log(parsedJson); // { hello: 'world' }
});
```
Using `axios.create` to set the custom configuration as a default, and showing the result for an existent URL that is *not* valid JSON:
```js
"use strict";
const axios = require("axios");
const Promise = require("bluebird");
const getJson = require("axios-get-json-response");
let manualAxios = axios.create(getJson.axiosConfiguration);
Promise.try(() => {
return manualAxios.get("http://cryto.net/invalid.json"); // {"hello": "world"
}).then((response) => {
let parsedJson = getJson.parse(response);
/* throws: ParsingFailed: Could not parse response body as JSON */
console.log(parsedJson);
});
```
The result for a non-existent URL:
```js
"use strict";
const axios = require("axios");
const Promise = require("bluebird");
const getJson = require("axios-get-json-response");
let manualAxios = axios.create(getJson.axiosConfiguration);
Promise.try(() => {
return manualAxios.get("http://cryto.net/non-existent.json"); // URL does not exist
}).then((response) => {
let parsedJson = getJson.parse(response);
/* throws: BadResponseCode: Got an unexpected HTTP status code (404) */
console.log(parsedJson);
});
```
## API
### getJson.axiosConfiguration
Some preset configuration options, that disable response code checking and body parsing in Axios. Needed for this library to work. These options are fed directly into Axios; see the example.
### getJson.parse(response, [options])
Validates the status code and parses the response body. Returns the parsed JSON if successful, or throws either a `BadStatusCode` or `ParsingFailed` error depending on what went wrong (see below).
- __response:__ The Axios response object to handle.
- __options:__ *Optional.*
- __validateStatus:__ *Optional.* A custom status code validation function, like in Axios. Defaults to the same as in Axios (all 2XX are considered valid). Expected to return `true` for a valid/expected status code, and `false` for an unexpected one.
### getJson.BadStatusCode
An error type that signifies that an unexpected status code was received.
Extra properties on this error object:
- __statusCode:__ The received status code.
### getJson.ParsingFailed
An error type that signifies that the response body could not be parsed as JSON.
## Changelog
### 1.0.0 (August 30, 2019)
Initial release.

@ -0,0 +1,13 @@
"use strict";
const axios = require("axios");
const Promise = require("bluebird");
const getJson = require(".");
Promise.try(() => {
return axios.get("http://cryto.net/test.json", getJson.axiosConfiguration); // {"hello": "world"}
}).then((response) => {
let parsedJson = getJson.parse(response);
console.log(parsedJson); // { hello: 'world' }
});

@ -0,0 +1,16 @@
"use strict";
const axios = require("axios");
const Promise = require("bluebird");
const getJson = require(".");
let manualAxios = axios.create(getJson.axiosConfiguration);
Promise.try(() => {
return manualAxios.get("http://cryto.net/invalid.json"); // {"hello": "world"
}).then((response) => {
let parsedJson = getJson.parse(response);
/* throws: ParsingFailed: Could not parse response body as JSON */
console.log(parsedJson);
});

@ -0,0 +1,16 @@
"use strict";
const axios = require("axios");
const Promise = require("bluebird");
const getJson = require(".");
let manualAxios = axios.create(getJson.axiosConfiguration);
Promise.try(() => {
return manualAxios.get("http://cryto.net/non-existent.json"); // URL does not exist
}).then((response) => {
let parsedJson = getJson.parse(response);
/* throws: BadResponseCode: Got an unexpected HTTP status code (404) */
console.log(parsedJson);
});

@ -0,0 +1,35 @@
"use strict";
const defaultValue = require("default-value");
const createError = require("create-error");
let BadStatusCode = createError("BadResponseCode");
let ParsingFailed = createError("ParsingFailed");
module.exports = {
BadStatusCode,
ParsingFailed,
axiosConfiguration: {
/* We do the status check manually in the response-handling code, so that we can identify it as a specific type of error. */
validateStatus: () => true,
/* Likewise, we manually attempt to parse the response body. */
responseType: "text",
/* The `responseType` setting above is currently (erroneously?) being ignored by Axios, and it tries to parse JSON anyway, which gives us an inconsistent result. This happens through the default `transformResponse` handler, so we remove that behaviour here by overriding it. */
transformResponse: (data) => data
},
parse: function parseJsonResponse(response, options = {}) {
let validateStatus = defaultValue(options.validateStatus, (status) => status >= 200 && status < 300);
if (validateStatus(response.status)) {
console.log(response.data);
try {
return JSON.parse(response.data);
} catch (error) {
throw new ParsingFailed("Could not parse response body as JSON");
}
} else {
throw new BadStatusCode(`Got an unexpected HTTP status code (${response.status})`, { statusCode: response.status });
}
}
};

@ -0,0 +1,17 @@
{
"name": "axios-get-json-response",
"description": "A small utility for validating an axios response and parsing it as JSON, *with* distinguishable error types",
"version": "1.0.0",
"main": "index.js",
"repository": "http://git.cryto.net/joepie91/axios-get-json-response.git",
"author": "Sven Slootweg <admin@cryto.net>",
"license": "WTFPL OR CC0-1.0",
"dependencies": {
"create-error": "^0.3.1",
"default-value": "^1.0.0"
},
"devDependencies": {
"axios": "^0.19.0",
"bluebird": "^3.5.5"
}
}

@ -0,0 +1,57 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
axios@^0.19.0:
version "0.19.0"
resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.0.tgz#8e09bff3d9122e133f7b8101c8fbdd00ed3d2ab8"
integrity sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==
dependencies:
follow-redirects "1.5.10"
is-buffer "^2.0.2"
bluebird@^3.5.5:
version "3.5.5"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f"
integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==
create-error@^0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/create-error/-/create-error-0.3.1.tgz#69810245a629e654432bf04377360003a5351a23"
integrity sha1-aYECRaYp5lRDK/BDdzYAA6U1GiM=
debug@=3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==
dependencies:
ms "2.0.0"
default-value@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/default-value/-/default-value-1.0.0.tgz#8c6f52a5a1193fe78fdc9f86eb71d16c9757c83a"
integrity sha1-jG9SpaEZP+eP3J+G63HRbJdXyDo=
dependencies:
es6-promise-try "0.0.1"
es6-promise-try@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/es6-promise-try/-/es6-promise-try-0.0.1.tgz#10f140dad27459cef949973e5d21a087f7274b20"
integrity sha1-EPFA2tJ0Wc75SZc+XSGgh/cnSyA=
follow-redirects@1.5.10:
version "1.5.10"
resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a"
integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==
dependencies:
debug "=3.1.0"
is-buffer@^2.0.2:
version "2.0.3"
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725"
integrity sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==
ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
Loading…
Cancel
Save