# @soapi/middlewares

<!-- description -->
@soapi/sdk常用中间件。
<!-- description -->

## Install

```shell
npm install @soapi/middlewares
```

or use yarn

```shell
yarn add @soapi/middlewares
```

## Usage

<!-- usage -->
### compose(middlewares)

参数是一个`middleware`数组。将多个middleware组合成一个新的middleware。

### checkSchema([errorHandler])

校验接口参数和返回值是否符合接口平台定义的规范。
errorHandler是一个可选参数，处理校验错误。如果不穿此参数，错误会被抛出。


### setEnv()

设置环境变量，影响最终请求的url地址。

### setHeader(key, value)

设置请求的Header。

### catchError(errorHandler)

捕获错误并对错误进行处理。catchError只会处理后面中间件抛出的错误，`app.use`与`koa`的洋葱模型一致。

```javascript
app.use(catchError(error => {
    console.log('what the fuck!')

    /**
     * 这里如果不抛出错误
     * sdk会认为您已经将错误正确的处理，并将继续执行
     * 这将导致sdk的api被调用时候，向外抛出的错误被中间件拦截并处理
     * 调用的地方将无法得知错误的发生，并按照正常调用处理
     */
    throw error
  }))
```

sdk会认为您已经将错误正确的处理，并将继续执行
这将导致sdk的api被调用时候，向外抛出的错误被中间件拦截并处理
调用的地方将无法得知错误的发生，并按照正常调用处理

<!-- usage -->

<!-- supplement -->

## Q&A

### 错误上报

```javascript
import { sendError } from 'sheinq'
import { catchError } from '@soapi/middlewares'

const reportErrorMiddleware = catchError(error => {
  sendError(error)
  throw error
})

app
  .use(reportErrorMiddleware)
  // checkSchema写在后面，report
  .use(checkSchema())
```
<!-- supplement -->
