2017-12-05 10 views
1

rxjs 5.5でredux-observableを使用していて、ノードエクスプレスサーバに基本的なajax POSTリクエストを作成しようとしています。RXJS5でObservable.ajax.postリクエストを正しく作成するには

Observable.ajaxの関連ドキュメントや最新の作業例は見つかりません。提供されているどのような解決策は、実際のAPIに従って正しい署名であることを見せかけにもかかわらず、いくつかのエラーをスローするように見える

使用して私の現在のコードスニペット(Reduxの-観測可能にし、5.5 rxjs:以下のとおりである:

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))}) 
} 

最初の問題は、crossDomainプロパティをtrueに設定したいということです。デフォルトはfalseですが、そのような場所は存在しないようです設定するプロパティ(Chrome Devツールに表示されているにもかかわらず)

ここにエラーがあります:

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

私は、URLがポストにヒットしたときに、単に基本的なJSONオブジェクトを返しますバックエンドで簡単なExpressサーバを使用しています。ただし、このエンドポイントは上記の現在のObservable.ajax.postリクエストではヒットしません。

CORSを許可するChromeプラグインがあり、Axiosなどの他のライブラリを使用しているようです。しかし、私はObservablesを使うのが好きで、redux-observableとrxjsは偉大なライブラリであり、著者には名誉ですが、ajaxの問題の一番下には入りません。誰も助けることができますか?

+0

約束でredux-observableを使うことができますが、['Observable.fromPromise'](http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html)を使って約束をオブザーバブルに変換するだけです。 #static-method-fromPromise) –

答えて

1

私はこの解決策が実際にそれをどのように修正したかはわかりませんが、Apiと揃っていないので、問題を克服したようです。誰かが似たような問題を抱えている場合のための私の解決策です

として私の混乱がObservable.ajax.postを提供する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))); 
} 

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

渡す。しかし、特定のポストメトことなく、AJAXを使用しては次のように与えられる

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

リクエストオブジェクトのパラメータとして 'POST'に設定します。これらの2つの署名は混乱しているようです。 ajax()が失敗した場合、なぜ1人はajax.post()を使用しますか?

誰もがこれに対する洞察を持っていますか?

+0

'ajax.post()'は引数から 'AjaxRequest'オブジェクトを構築します。ここで' crossDomain'のデフォルト値はfalseです。 'ajax()'は実際の 'AjaxRequest'を定義することができるので、' crossDomain'を設定することができます。 'post()'、 'get()'などのメソッドは便利なので、 'ajax()'を直接使うことはAPIとの整合性があり、ユースケースとして便利です。 –

+0

いい説明、ありがとう! – stevematdavies

関連する問題