React/Redux + 超级代理,第一个调用被终止

IT技术 javascript reactjs redux superagent
2021-05-14 13:32:57

我正在编写一个 react-redux 应用程序,我正在使用 superagent 在我的中间件中进行一些服务调用。我发现了一个非常奇怪的行为,对我的搜索 api 的第一次调用总是被终止。我尝试在拨打第一个电话之前等待 10-30 秒,并记录整个过程中的每一步,但我似乎无法确定为什么会发生这种情况。

我的动作创建者看起来像

export function getSearchResults(searchQuery) {
return {
        query: searchQuery,
        type: actions.GO_TO_SEARCH_RESULTS
    }
}

它在这里击中了中间件逻辑:

var defaultURL = '/myServer/mySearch';

callPendingAction();

superagent.get(defaultURL)
        .query({query: action.query})
        .end(requestDone);


//sets state pending so we can use loading spinner
function callPendingAction() {
    action.middlewares.searchIRC.readyState = READY_STATES.PENDING;
    next(action);
}

//return error or response accordingly
function requestDone(err, response) {
    console.log("call error", err);
    const search = action.search;
    if (err) {
        search.readyState = READY_STATES.FAILURE;
        if (response) {
            search.error = response.err;
        } else if (err.message) {
            search.error = err.message;
        } else {
            search.error = err;
        }
    } else {
        search.readyState = READY_STATES.SUCCESS;
        search.results = fromJS(response.body);
    }
    return next(action);
}

即使呼叫终止,查询也是正确的,我收到此错误消息:

Request has been terminated
Possible causes: the network is offline, Origin is not allowed by Access-Control-Allow-Origin, the page is being unloaded, etc.
at Request.crossDomainError (http://localhost:8000/bundle.js:28339:14)
at XMLHttpRequest.xhr.onreadystatechange (http://localhost:8000/bundle.js:28409:20)

看起来页面也每次刷新。

我似乎找不到任何关于为什么会发生这种情况的线索,第一次调用失败似乎无关紧要,但是在第一次终止调用之后就可以了。将不胜感激任何输入,谢谢!

更新:所以这似乎与 chrome 有关,我在Version 47.0.2526.80 (64-bit). 这个应用程序是另一个应用程序中的 iframe,我相信这会导致 chrome 出现问题,因为当我在 Firefox 中尝试这个时,没有问题。奇怪的是只有第一个调用给出了 CORS 问题,然后它似乎在此之后得到纠正。如果有人有意见或解决方法,我将不胜感激。谢谢阅读。

3个回答

遇到了同样的问题,这要归功于@KietIG提供的关于ReactJS 和 React Router主题答案- Chrome 上的奇怪路由行为

答案与 CORS 无关。请求被取消,因为 Chrome 在请求中间离开了页面。发生这种情况是因为event.preventDefault()没有在表单提交处理程序之一中调用。Chrome 的处理方式似乎与其他浏览器不同。

有关更多详细信息,请参阅上面的答案链接。

在我的情况下,当我尝试X-Test在客户端设置随机 HTTP 请求标头(如)并且 AWS Lambda 在 OPTIONS 请求期间拒绝它或其他原因时发生了这种情况。

我不知道副作用,但你会收到 CORS 错误。.withCredentials()方法添加到您的请求中。

从超级代理文档

.withCredentials() 方法能够从源发送 cookie,但是只有当“Access-Control-Allow-Origin”不是通配符(“*”),并且“Access-Control-Allow-Credentials”是“真的”。

这应该解决它:

superagent.get(defaultURL)
        .query({query: action.query})
        .withCredentials()
        .end(requestDone);

可以在此处找到有关跨源资源共享的更多信息