我正在使用带有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问题。有人可以帮忙吗?
答案 0 :(得分:2)
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()
?
有人对此有任何见解吗?