You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

106 lines
3.4 KiB
Markdown

# 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.1 (August 30, 2019)
- Removed erroneous `console.log`.
### 1.0.0 (August 30, 2019)
Initial release.