🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

CORS

CORSとはCross-Origin Resource Sharingの頭文字をとったもので、ブラウザがオリジン以外のサーバからデータを取得するシステムのことです。

Q&A

解決済

1回答

2912閲覧

CORSエラーによりサーバにデータを渡せない

malfoy_

総合スコア2

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

CORS

CORSとはCross-Origin Resource Sharingの頭文字をとったもので、ブラウザがオリジン以外のサーバからデータを取得するシステムのことです。

0グッド

3クリップ

投稿2021/01/23 05:54

編集2021/01/23 05:58

前提・実現したいこと

Vue.js、Quasar、Node.js、Firebaseを使用して簡単な記録アプリを作っています。
現在データ登録機能を実装中ですが、ブラウザでデータ登録時に以下のCORSエラーが発生します。

発生している問題・エラーメッセージ

Access to XMLHttpRequest at 'http://localhost:3000/createRecord' from origin 'http://localhost:8080' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

'Access-Control-Allow-Origin'はバックエンドで設定しているはずなのに。。。

該当のソースコード

フロントエンド

vue

1methods: { 2 createRecord() { 3 4 let formData = new FormData(); 5 formData.append("test", this.record.test); 6 formData.append("date", this.record.date); 7 8 this.$axios 9 .post(`${process.env.API}/createRecord`, formData) 10 .then(response => { 11 console.log("response: ", response); 12 }) 13 .catch(err => { 14 console.log("err: ", err); 15 }); 16 )

バックエンド

JavaScript

1app.post('/createRecord', (request, response) => { 2 response.header('Access-Control-Allow-Origin', '*'), 3 db.collection('records').add({ 4 test: request.body.test, 5 date: request.body.date 6 }).then(() => { 7 response.send('Record added') 8 }) 9 console.log(request.body) 10 })

試したこと

axiosではなくfetchAPIを用いて以下のように実装しましたが、引き続きcorsエラーが発生し解決しませんでした。

フロントエンド

vue

1//省略// 2 3let formData = { 4 test: this.record.test, 5 date: this.record.date, 6} 7 8fetch(`${process.env.API}/createRecord`, { 9 method: "post", 10 mode: "cors", 11 cache: "no-cache", 12 credentials: "include", 13 headers: { 14 "Content-Type": "application/json" 15 }, 16 body: JSON.stringify(formData) 17 }) 18//省略// 19

バックエンドでは以下を追加してみましたが、解決に至りませんでした。

JavaScript

1 response.header('Access-Control-Allow-Origin', '*'), 2 response.header('Access-Control-Allow-Headers', 'Content-Type'), 3 response.header('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS'), 4 response.header('Access-Control-Max-Age', '600');

fetchAPIでmode: "no-cors"にするとデータ登録が可能ですが、セキュリティ面で危ないということでしたので、mode: "cors"の状態でデータを登録したいです。

corsについての知識が浅いため、フロント・バックエンド共にどのような実装にすべきか分からない状態です。
どなたかご回答いただけると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

エラーメッセージに "Response to preflight request doesn't pass access control check" とあるので、プリフライトリクエストの処理が抜けているということでしょう。app.optionsメソッドが必要なのではないですか?


(追記)
以下のようにapp.optionsを追加したらどうでしょうか?

// app.optionsを追加 app.options('*', (request, response) => { response.header('Access-Control-Allow-Origin', '*'), response.header('Access-Control-Allow-Headers', 'Content-Type'), }); // app.postはそのまま app.post('/createRecord', (request, response) => { response.header('Access-Control-Allow-Origin', '*'), db.collection('records').add({ test: request.body.test, date: request.body.date }).then(() => { response.send('Record added') }) console.log(request.body) })

投稿2021/01/23 09:17

編集2021/01/23 13:57
ockeghem

総合スコア11705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

malfoy_

2021/01/23 10:59 編集

ご回答ありがとうございます! 以下の記載を追記したところ、"Response to preflight request doesn't pass access control check" のエラーは解消いたしました。 app.options.set('Access-Control-Request-Headers', 'Content-Type') しかし、”No 'Access-Control-Allow-Origin' header is present on the requested resource.”の部分のエラーに関しては未だに解消できていません。 Originに以下のような設定を施しましたが、問題解決には至りませんでした。 response.header('Access-Control-Allow-Origin', 'https://localhost:8080') app.optionsで他にも設定が必要な項目があるのでしょうか。
malfoy_

2021/01/23 15:04

ありがとうございます! 共有いただいた記事を参考に以下の記載に修正したところ、エラーが解消しました。 response.header('Access-Control-Allow-Origin', request.headers.origin); response.header('Access-Control-Allow-Headers', 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept'); response.header('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS'); response.header('Access-Control-Allow-Credentials', true); response.header('Access-Control-Max-Age', '86400'); response.sendStatus(200);
ockeghem

2021/01/24 01:48

その方法では脆弱性があります。'Access-Control-Allow-Origin' に対する値は '*' にして、'Access-Control-Allow-Credentials', true は削除してください。質問本文に(追記)とした方法が安全です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問