如何在RXJS5中正确生成Observable.ajax.post请求

时间:2017-12-05 10:22:47

标签: ajax reactjs rxjs redux-observable

我正在使用带有rxjs 5.5的redux-observable,我正在尝试向节点快速服务器发出基本的ajax POST请求。

我似乎无法找到Observable.ajax的任何相关文档或最新工作示例。无论提供什么解决方案似乎都会产生一些错误,尽管根据实际的API似乎是正确的签名

我目前使用的代码片段(redux-observable和rxjs 5.5:如下:

const loginEpic = (actions) =>  { 

    const opts = credentials => {
        const { username, password } = credentials;
        return {
            url: 'http://localhost:3001/login',
            body:{ username, password },
            headers: {  'Content-Type': 'application/json; charset=utf-8' },
        };       
    };

     return actions.ofType(ActionTypes.LOGIN_REQUESTED)
        .switchMap(({credentials}) => {
            const { url, body, headers } = opts(credentials)
            return Observable.ajax.post(url, body, headers)
            .map(loginResponse => 
                loginResponse.status===200
                    ? loginResolvedAction(loginResponse.response)
                    : loginFailedAction(loginResponse.response))})
}

这是尝试使其工作的第n次迭代,但无济于事。第一个问题是,我想将crossDomain属性设置为true,因为它默认为false,但是,似乎没有任何地方可以设置这样的属性(尽管Chrome Dev Tools显示它在那里。

这是错误:

Failed to load http://localhost:3001/login: Request header field X-Requested-With is not allowed by Access-Control-Allow-Headers in preflight response.

我在后端使用一个简单的快速服务器,只需在帖子上点击网址时返回一个基本的JSON对象。但是,上面的当前Observable.ajax.post请求不会触发此端点。

我有一个允许使用CORS的Chrome插件,并且使用Axios等其他库似乎可以正常工作。但是,我更喜欢使用Observables和redux-observable,而rxjs是很棒的库,对作者来说是赞誉,但我无法深入了解ajax问题。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

嗯,我似乎已经克服了这个问题,虽然我看不出这个解决方案是如何实际修复它的,因为它与Api不一致。这是我的解决方案,以防任何人有类似的问题。

const reportsEpic = (actions) => {

    const requestSettings = token => ({
        url:`http://localhost:3001/testReports/${token}`, 
        crossDomain: true,
        contentType: "application/json; charset=utf-8",
        responseType:'json',
    })

    return actions.ofType(ActionTypes.REPORTS_REQUESTED)
        .switchMap(({token}) => 
            Observable.ajax(requestSettings(token))
            .map(reportsResponse => 
                reportsResolvedAction(reportsResponse.response)));
}

我的混淆来自于Api,它提供了Observable.ajax.post:

(method) AjaxCreationMethod.post(url: string, body?: any, headers?: Object): Observable<AjaxResponse>

然而,使用没有特定postopo的ajax的原因如下:

let Observable<T>.ajax: AjaxCreationMethod(urlOrRequest: string | AjaxRequest) => Observable<AjaxResponse>

将'POST'作为请求对象参数传递。这两个签名似乎令人困惑。如果ajax.post()失败,为什么会使用ajax()

有人对此有任何见解吗?