使用redux-api-middleware
我遇到了一个问题,其中只有一个我的reducer函数没有触发。
我想以类似于处理成功的api请求的方式处理失败的api请求。但就我所知,SEARCH_FAILURE
FSA永远不会得到处理,尽管它与SEARCH_SUCCESS
FSA的处理方式相同(AFAICT)。根据我在devtools中看到的内容,它似乎确实是创建和发送的。
我有这个
import { CALL_API } from 'redux-api-middleware'
import { handleActions } from 'redux-actions'
const searchReducer = handleActions({
//... other handlers elided
SEARCH_SUCCESS: (state = defaultState, action) => {
return {
...state,
search_results: ({...action.payload}),
api: {
requestPending: false,
searchPending: false
},
}
},
SEARCH_FAILURE: function(state = defaultState, action) {
console.log("Handling SEARCH_FAILURE given state, action: ", state, action)
return {
...state,
search_results: {Total: 0},
api: {
requestPending: false,
error: action.payload
},
errors: [action.payload, ...state.errors]
}
},
})
SEARCH_SUCCESS
FSA由searchReducer
处理,但是当服务器给出400响应时,SEARCH_FAILURE
处理程序永远不会被调用 - 至少我看不到日志输出我希望,国家肯定不会看起来正确。但是,我确实在redux devtools面板中看到了SEARCH_FAILURE
条目。
为了让我更加困惑,这是我目前创建RSAA的声明
export function doSearch( selected_filters, page ){
let qs = SearchPage.constructQueryString(selected_filters, page)
return {
[CALL_API]: {
endpoint: `/api/songs/search?${qs}`,
method: 'GET',
types: [
{type: SEARCH_REQUEST},
{type: SEARCH_SUCCESS},
{
type: SEARCH_FAILURE,
payload: (action, state, res) => {
if (400 === res.status)
{
console.log(`${SEARCH_FAILURE} payload: `, action, state, res)
}
return res
}
},
],
headers: { 'Content-Type': 'application/json' },
credentials: 'include'
}
}
}
调用payload
函数 并且或多或少地记录我期望的内容。那么我在这里搞砸了什么?至于我可以从redux-api-middleware
的文档的多个读数中辨别出来,这个设置应该产生我想要的行为,但事实并非如此。成功成功,但失败失败......
答案 0 :(得分:0)
当我用一个对象定义我的一个类型而不是你正在为SEARCH_FAILURE做的动作时,我遇到了类似的问题。我最后通过更新我的package.json来修复:
"redux-api-middleware": "^1.0.0-beta3",
我认为问题是文档描述了1.0.0版本的API,但是当你:
npm install redux-api-middleware --save
您最终获得了该软件包的早期版本。