質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Angular

Angularは、JavaScriptフレームワークです。AngularJSの後継であり、TypeScriptベースで実装されています。機能ごとに実装を分けやすく、コードの見通しが良いコンポーネント指向です。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

1回答

884閲覧

Docker環境下でのangularからのhttp通信について

sky123

総合スコア1

Angular

Angularは、JavaScriptフレームワークです。AngularJSの後継であり、TypeScriptベースで実装されています。機能ごとに実装を分けやすく、コードの見通しが良いコンポーネント指向です。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

0クリップ

投稿2021/05/01 11:40

前提・実現したいこと

現在フロントサーバー+APIサーバー+MySQLサーバーをそれぞれ別で構築し、
3つのサーバーを連結して1つのシステムとなるような仕組みを勉強しています。

その中でフロント→APIサーバーへのリクエスト時に下記のエラーが発生しました。
いくつか検索して試したのですが対応方法が分からずお知恵を貸していただけると幸いです。

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

ChromeのDevToolsにて下記表示

Access to XMLHttpRequest at 'localhost:3001/asset' from origin 'http://localhost:8080' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, chrome-untrusted, https.

エラー内容をみるにXHRはサポートしていないよ。
HTTPなどで試してねということだと思っています。
ただXHRはjsからHTTP通信を行うものという理解なので、
厳密には違うからできないよというエラーなのでしょうか。
このようなやり方をされているサイトがいくつもあったので不思議に思っています。

該当のソースコード(フロント)

Dockerコンテナ上に配置

function assetsgetCtrl($scope, $http) { $scope.test = function(){ var send = { name: "test" } console.log("通信開始"); $http({ method: 'GET', url: 'localhost:30010/asset', // contentType: 'application/JSON', headers: { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': "*", 'Accept': 'application/json' }, data: send }).then(function DoneCallback(res){ console.log("通信成功"); console.log(res); },function failCallback(res){ console.log("通信失敗"); }); } }

該当のソースコード(API)

Dockerコンテナ上に配置(フロントとは違うコンテナ)

var exp = require("express"); var app = exp(); var mysql = require("mysql"); var connection = mysql.createConnection({ host: "host.docker.internal", user: "***", password: "***", database: "***" }); app.get("/",function(req,res){ res.send("Hello-Worldaaa"); }) app.get("/asset", function (req, res) { connection.query('select * from tams.MST_ASSET', function (error, results, fields) { if (error) throw error; res.header("Access-Control-Allow-Origin", "*"); res.send(results); }); }); // CORSを許可する app.use((req, res, next) => { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); next(); }); app.listen(3001,function(){ console.log("成功") })

試したこと

  • APIサーバーのURL直叩きは問題なし
  • API実行時にAccess-Control-Allow-Originを追加(現在のソースの状況)
  • safariなどの別ブラウザでの実施(Chromeが原因との記事もあったため)
  • APIサーバーと違うポートで実施(同じエラーだったのでフロント側の問題?)

補足情報(FW/ツールのバージョンなど)

フロント
  • Dockerコンテナ上でサーバー起動
  • angularJS
  • localhost:8080
  • gulpにてサーバー起動
API
  • Dockerコンテナ上でサーバー起動
  • express
  • localhost:3001
  • nodeにてサーバー起動
PC環境
  • MACOS Catalina 15.17

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

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

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

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

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

sky123

2021/05/06 13:08

ありがとうございます。上記サイトで改めて勉強させていただきました。 非常にわかりやすいサイトでした。 自分のサーバー側ではプリフライトを受ける体勢が整っていなかったようです。
guest

回答1

0

ベストアンサー

$http({ method: 'GET', url: 'localhost:30010/asset', // contentType: 'application/JSON', headers: { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': "*", 'Accept': 'application/json' }, data: send })

url: 'localhost:30010/asset'の部分の頭にhttp://がついていないので、「CORSに対応していないスキーマだよ」というエラーが出てるのではないかと推測します。

投稿2021/05/02 13:53

kaito3desuyo

総合スコア143

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

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

sky123

2021/05/06 13:06 編集

ありがとうございます。解決しました。 とんだ凡ミスでした。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問