什么是中间件?
中间件就是插在源到指标之间的一段逻辑(个别为函数,比方redux)

redux中源为页面,指标为store中的state,通过dispatch将页面中的数据反映到store中

koa中源为request,指标为response,

redux中在dispatch数据到store只调用了dispatch这个函数,所以只能对这个函数进行革新,两头去插入中间件。

为什么redux须要中间件?
dispatch函数第一句话:

    if (!isPlainObject(action)) {      throw new Error(        'Actions must be plain objects. ' +          'Use custom middleware for async actions.'      )    }

isPlainObject函数的目标是查看action是不是对象字面量或者new object()结构进去的对象,其余的比方action为函数,redux间接报错。比方异步申请,须要将从接口申请到的数据放到redux。
咱们能够间接发动异步申请,而后将数据dispacth到redux里
redux@4.0.0 shopping-cart actions/index.js

export const checkout = products => (dispatch, getState) => {  const { cart } = getState()  dispatch({    type: types.CHECKOUT_REQUEST  })  shop.buyProducts(products, () => {    dispatch({      type: types.CHECKOUT_SUCCESS,      cart    })  })}

为了对立写异步申请,将申请函数放在一个文件里,这样不会显得芜杂。然而dispatch跟getState怎么拿到,connect后能够拿到dispatch,getState拿不到,只能通过mapStateToProps传递state.这么操作比拟麻烦,在中间件中对立解决就不须要每次调用传递dispatch getState。怎么对一个函数函数革新 插入中间件?

深刻了解洋葱模型中间件机制
Koa 框架教程