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

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

詳細はこちら
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

2689閲覧

create-react-appで立てたサーバからexpressで立てたサーバにアクセスした時のCORSエラーが解決できない

ring-ring-ring

総合スコア2

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

WebSocket

WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2020/11/22 13:52

reactサーバと別サーバでwebsocket通信をしたい

reactでSPAを作っている中で(http://localhost:3000)双方向通信実装のためにwebsocketを導入しようと思い、expressでサーバを(http://localhost:8080)立てたのですがCORSエラーが解決できません。
かなり時間をかけていろいろ自分で調べましたが解決できませんでした。
どなたかわかる方助言いただきたいです。

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

Access to XMLHttpRequest at 'http://localhost:8080/socket.io/?EIO=4&transport=polling&t=NNm5Fvs' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

フォルダ構成(一部)

src
├── App.jsx
├── index.js
├── server
│   └── server.js
〜〜〜〜

js

1//src/server/server.js 2 3const express = require('express'); 4const app = express(); 5 6app.use(function(req, res, next){ 7 res.header('Access-Control-Allow-Origin', '*'); 8 res.header('Access-Control-Allow-Headers', 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept'); 9 res.header('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS'); 10 res.header('Access-Control-Allow-Credentials', true); 11 res.header('Access-Control-Max-Age', '86400'); 12 next(); 13}); 14 15 16app.options('*', function (req, res) { 17 res.sendStatus(200); 18}); 19 20app.get('/', function(req, res){ 21 res.send('<h1>hello world</h1>'); 22}); 23 24var http = require('http').createServer(app); 25var io = require('socket.io')(http); 26 27io.on('connection', function(socket){ 28 console.log('a user connected'); 29}); 30 31 32http.listen(8080, function(){ 33 console.log('listening on *:8080') 34}); 35 36

試したこと

同じようなエラーを解決している人がたくさんいたのでその人たちの記事を参考にしながら、エラー分に言われるとおりにAccess-Control-Allow-Originに他サーバーからのアクセスを許可するように書いた。
またreact側がCORS対応できていないのかと思い、プロキシを8080番に設定したがエラー分は変わらず

json

1// ../package.json 2 3 "proxy": "http://localhost:8080",

補足情報

react側環境
・create-react-appで環境構築
・ポート番号:"http://localhost:3000"
node側環境
・"express": "^4.17.1"で環境構築
・ポート番号:"http://localhost:8080"

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

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

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

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

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

guest

回答1

0

ベストアンサー

res.header('Access-Control-Allow-Credentials', true);

にするなら

res.header('Access-Control-Allow-Origin', '*');

はワイルドカードをやめて明示的に指定しましょう

それ以外にもメソッドによる違い、レスポンスのステータスコードによる違いなどあるので、質問に載せられていないコードで関係ありそうなだと思えば調べましょう。

追記に対して

クライアント側の書き方がそれならサーバー側は公式を参考に(socket.io V3)以下の通り

const io = require("socket.io")(httpServer, { cors: { origin: "https://example.com", methods: ["GET", "POST"] } });

まずはcredentials: trueのオプションは消してorigin: "*"で試してみるのがよろしい

コメントにコード書かれても読み辛くてちゃんと見る気失せるので、コードを追記する時は質問を編集してコードを書いてください

投稿2020/11/22 14:24

編集2020/11/23 02:23
hentaiman

総合スコア6426

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

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

ring-ring-ring

2020/11/23 02:14 編集

回答ありがとうございます! app.use()内を必要と思われる部分だけに絞って、また受け付けるURLも明示的にしましたが、同じエラーでうまくいきませんでした。 ``` app.use(function(req, res, next){ res.header('Access-Control-Allow-Origin', 'http://localhost:3000'); next(); }); ``` また、クライアント側でsocket通信をするコードを載せていなかったので追記します。 すみませんでした ``` // src/store/store.js import { createStore as reduxCreateStore, combineReducers, applyMiddleware } from 'redux'; import { connectRouter, routerMiddleware } from 'connected-react-router'; import thunk from 'redux-thunk'; import io from 'socket.io-client' import { matchReducer } from '../match/reducks/reducers'; import { orderReducer } from '../order/reducks/reducers'; import { serverReducer } from '../server/reducks/reducers'; let socket; export default function createStore(history) { if(!socket){ socket = io(':8080'); //socket.io_client呼び出し } return reduxCreateStore( combineReducers({ router: connectRouter(history), matches: matchReducer, order: orderReducer, server: serverReducer }), applyMiddleware( routerMiddleware(history), thunk, ) ); } ``` また、このcreataStore(history)関数はindex.jsで呼び出され、ReactDOM.render()関数内で全てのコンポーネントをラップしています。 追記 サーバ側でsocket.ioを呼び出すときにオリジン設定をしてみたがエラー分は虚しくもそのまま ``` var io = require('socket.io')(http, {origins: ['http://localhost:3000']}); ```
ring-ring-ring

2020/11/23 03:11

ありがとうございました! コネクションが確立できました。 socket.ioでのオリジン設定の仕方が良くなかったのですね。 もう少し公式を中心に読み直してみます。 コードの追記は投稿を編集する形でしたらリッチテキストが使えて良いのですね。 具体的にやりながら教えていただいてありがとうございます。 以後気をつけます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問