axios-error-redact
Version:
Library to redact sensitive information from Axios errors
181 lines (119 loc) • 4.28 kB
Markdown
Library to redact sensitive information from Axios errors.
This can be used as an response interceptor for axios instances, or can be used standalone.
Works with
- `axios@^0`
- `axios@^1`
```console
npm i axios-error-redact
```
The redactor can simply be used in an interceptor to extract non-sensitive data from error and continue
```javascript
import axios from 'axios'
import {createErrorInterceptor} from 'axios-error-redact'
const instance = axios.create({baseURL: 'http://example.com'})
instance.interceptors.response.use(undefined, createErrorInterceptor())
try {
await instance.get()
} catch(error) {
// The isHttpErrorResponse helper can be used to ensure the thrown error is a redacted error
if (isHttpErrorResponse(error)) {
console.error(error.response.statusMessage, error.message)
}
}
```
The redactor can be used in an interceptor to extract non-sensitive data from error and continue, with this approach the interceptor can be created with some custom logic
```javascript
import axios from 'axios'
import {AxiosErrorRedactor} from 'axios-error-redact'
const instance = axios.create({baseURL: 'http://example.com'})
const redactor = new AxiosErrorRedactor()
function errorInterceptor(error: any): any {
const redactedError = redactor.redactError(error)
// You may want to add more logic here; for example logging
return Promise.reject(redactedError)
}
instance.interceptors.response.use(undefined, errorInterceptor)
// instance.get()
```
The library can be used on its own without using any interceptor as well.
```javascript
import axios from 'axios'
import {AxiosErrorRedactor} from 'axios-error-redact'
const redactor = new AxiosErrorRedactor()
const result = axios.get('http://example.com')
.catch(error => redactor.redactError(error))
```
The redactor is initialized with some defaults; in which all of the sensitive data will be redacted (request, response, query)
```javascript
import {AxiosErrorRedactor} from 'axios-error-redact'
const redactor = new AxiosErrorRedactor()
```
The constructor also accepts options to enable or disable these
```javascript
import {AxiosErrorRedactor} from 'axios-error-redact'
const redactor = new AxiosErrorRedactor({
redactRequestDataEnabled: false,
redactResponseDataEnabled: false,
redactQueryDataEnabled: false,
})
```
The main function that can be called on the initiated object is `redactError` which accepts the error as the input and returns the redacted information in an object of type `HttpErrorResponse`
```javascript
import axios from 'axios'
import {AxiosErrorRedactor} from 'axios-error-redact'
const redactor = new AxiosErrorRedactor()
const result = axios.get('http://example.com')
.catch(error => redactor.redactError(error))
```
There are three functions that can be used and chained after the initiated object in order to change what sort of data should be skipped to be redacted.
```javascript
import {AxiosErrorRedactor} from 'axios-error-redact'
const redactor = new AxiosErrorRedactor()
.skipRequestData()
.skipQueryData()
```
The redact library will extract information from axios error and return an object with following details.
```javascript
HttpErrorResponse {
isErrorRedactedResponse: true;
message: string;
fullURL: string;
response: {
statusCode?: number;
statusMessage: string;
data: any;
};
request: {
baseURL: string;
path: string;
method: string;
data: any;
};
}
```
If the error is not an axios error, then the same error will be returned.
The `isHttpErrorResponse()` function can be used as a type guard in TypeScript to narrow the error type.
This can be useful when multiple error types can be thrown from the try block.
Be sure not to use the `isAxiosError()` type guard provided by Axios since all intercepted Axios errors will be transformed into a `HttpErrorResponse`
```typescript
try {
...
} catch(error: unknown) {
if (isHttpErrorResponse(error)) {
// error is narrowed to type HttpErrorResponse
}
}
```