Closed no-yan closed 3 years ago
@noyanyan
すみません、そのやりかけのPRのことをすっかり忘れていました。
結論から言うと agreed-server
の起動オプションに --cors
をつけることによって、モックサーバのレスポンスヘッダに Access-Control-Allow-Origin: *
が付与されます。
npm run start
から起動すれば既にこのオプションつきで起動するようになっています。
ちなみにモックデータなんですが現状色々バグりまくってます (suman)
あまりフロント詳しくないのとagreedを使ったことがないので助言があまり出来ず…ごめんなさい こちらのプルリク を見る限り、 --cors のオプションをつける形に?
って被った どひ〜☝💦 @sei40kr さんありがとうございます。
お二人ともありがとうございます。 ですが実はfork先でも--corsを追加していて、少なくともそれだけの問題ではない気がします。 https://github.com/noyanyan/Shitforces/blob/f3f83dc20c5c0f45cf54110e5a7512fa0e73626a/frontend/package.json#L15
また、Access-Control-Allow-Origin: *
とすると、ワイルドカードは許可されていないとエラーが出ているはずです。windows/chromeの問題でしょうか?
もう少し調べてみますので、なにかあれば教えて下さい。
なるほど、このPRでリクエストにクレデンシャルを含めるようになったのが原因かもしれません。 https://github.com/ShopOne/Shitforces/pull/119
XMLHttpRequest
の .withCredentials
を true にするとオリジンの指定にワイルドカードが使えなくなるようです。
https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS/Errors/CORSNotSupportingCredentials
解決策として --cors
の代わりに --default-response-headers "{ 'Access-Control-Allow-Origin': 'http://localhost:3000', 'Access-Control-Allow-Credentials': true }"
とすると良さそうです。
オプションを--default-response-headers "{ 'Access-Control-Allow-Origin': 'http://localhost:3000', 'Access-Control-Allow-Credentials': true }"
に変更すると問題なくAPIを表示することができました。
2日ほど悩んでいたので、伺えてよかったです。ありがとうございます。
一方で、これをコマンド実行するためには引用符の三重ネストが必要になり、JSON5がパースできませんでした。
"start:mock-api": "agreed-server --path agreed.js --port 8080 --default-response-headers '{ \"Access-Control-Allow-Origin\": \"http://localhost:3000\", \"Access-Control-Allow-Credentials\": true }'"
なにか解決策がなければ、CLI実行することになりそうです。
上記のJSONがパースされない件、エスケープする対象を変えることで問題解決しました。 "start:mock-api": "agreed-server --path agreed.js --port 8080 --default-response-headers \"{ 'Access-Control-Allow-Origin': 'http://localhost:3000', 'Access-Control-Allow-Credentials': true }\"",
不思議ですね
96のプルリク@sei40krを引き継いでモックAPIを作っています。
現在、APIサーバーを起動してクライアント側からサーバーを叩くタイミングで、通信ができていません。
現象
ブラウザの一般的な仕様として同一ドメインでもポート番号が違う場合、通信するために設定で許可しなけれいけない(CORS)ようです。どう設定すれば正しく通信できるでしょうか?現在は次の設定をためしています。
確認方法
forkしたリポジトリから確認できます。
モックAPI設定ファイルは
frontend/agreed.js
にあります。