実現したいこと
- Reactのコード内からRailsAPIに接続してデータを取得したい
前提
DockerとReactの練習のため、Docker+RailsAPI+Reactで簡単なwebアプリを作っています。
Reactのコード内からAPIに接続する段階で、ERR_EMPTY_RESPONSEとなってしまい接続できません。
発生している問題・エラーメッセージ
GET http://localhost:3001/api/v1/pages net::ERR_EMPTY_RESPONSE Uncaught (in promise) Error: Minified React error #321; visit https://reactjs.org/docs/error-decoder.html?invariant=321 for the full message or use the non-minified dev environment for full errors and additional helpful warnings.
該当のソースコード
Dockerfile:api
1FROM ruby:3.1.3 2RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \ 3 && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \ 4 && apt-get update -qq \ 5 && apt-get install -y nodejs yarn \ 6 && mkdir /my_dictionary_api 7WORKDIR /my_dictionary_api 8COPY Gemfile /my_dictionary_api/Gemfile 9COPY Gemfile.lock /my_dictionary_api/Gemfile.lock 10RUN gem update --system 11RUN bundle install 12COPY . /my_dictionary_api 13 14COPY entrypoint.sh /usr/bin/ 15RUN chmod +x /usr/bin/entrypoint.sh 16ENTRYPOINT ["entrypoint.sh"] 17EXPOSE 3001
Dockerfile:front
1FROM node:17.2 2RUN mkdir /my_dictionary_front 3WORKDIR /my_dictionary_front
docker_compose.yml
1version: '3.8' 2services: 3 db: 4 platform: linux/x86_64 5 image: mysql:8.0 6 environment: 7 MYSQL_ROOT_PASSWORD: dictionary 8 ports: 9 - 3306:3306 10 command: --default-authentication-plugin=mysql_native_password 11 volumes: 12 - mysql-data:/var/lib/mysql 13 api: 14 build: ./api 15 command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3001 -b '0.0.0.0'" 16 volumes: 17 - ./api:/my_dictionary_api 18 - gem_data:/usr/local/bundle 19 ports: 20 - "3001:3000" 21 depends_on: 22 - db 23 stdin_open: true 24 tty: true 25 front: 26 build: ./front 27 command: yarn start 28 ports: 29 - "3000:3000" 30 volumes: 31 - ./front:/my_dictionary_front 32 depends_on: 33 - api 34 35volumes: 36 mysql-data: 37 gem_data: 38 driver: local
javascript
1//client.js 2 3import applyCaseMiddleware from 'axios-case-converter'; 4import axios from 'axios'; 5 6const options = { 7 ignoreHeaders: true 8} 9 10const client = applyCaseMiddleware( 11 axios.create({ 12 baseURL: "http://localhost:3001/api/v1", 13 }), 14 options 15) 16 17export default client
javascript
1//pages.js 2 3import client from './client'; 4export const Top = () => { 5 return client.get('/pages'); 6}
ruby
1#pages_controller.rb 2 3class Api::V1::PagesController < ApplicationController 4 def index 5 test_json = { 6 data: [ 7 {id: 1, title: 'first text', text: '最初のテキスト'}, 8 {id: 2, title: 'second text', text: '2行目のテキスト'} 9 ] 10 } 11 12 render json: test_json 13 end 14end
ruby
1#cors.rb 2 3Rails.application.config.middleware.insert_before 0, Rack::Cors do 4 allow do 5 origins "localhost:3001" 6 7 resource "*", 8 headers: :any, 9 methods: [:get, :post, :put, :patch, :delete, :options, :head] 10 end 11end
試したこと
- corsを設定しました
docker ps
で確認してみましたが、問題点がわかりませんでした
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 8b8e4889c354 dictionary_front "docker-entrypoint.s…" 4 hours ago Up 3 minutes 0.0.0.0:3000->3000/tcp dictionary_front_1 e2010b11a04c dictionary_api "entrypoint.sh bash …" 4 hours ago Up 3 minutes 3001/tcp, 0.0.0.0:3001->3000/tcp dictionary_api_1 095a584316a3 mysql:8.0 "docker-entrypoint.s…" 4 hours ago Up 3 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp dictionary_db_1
- apiコンテナ内で
curl
してみましたが、こちらは正常にアクセスできました
root@e2010b11a04c:/my_dictionary_api# curl http://localhost:3001/api/v1/pages {"data":[{"id":1,"title":"first text","text":"最初のテキスト"},{"id":2,"title":"second text","text":"2行目のテキスト"}]}root@e2010b11a04c:/my_dictionary_api#
- エラーの
Minified React error #321
について、reactが2回呼ばれているところがないか確認しましたが、ありませんでした
補足情報(FW/ツールのバージョンなど)
- Ruby 3.1.3
- Rails 7.0.4.2
- React 18.0.0
- axios 1.3.2
よろしくお願いいたします。
あなたの回答
tips
プレビュー