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

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

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

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

ネットワーク

ネットワークとは、複数のコンピューター間を接続する技術です。インターネットが最も主流なネットワークの形態で、TCP/IP・HTTP・DNSなどの様々なプロトコルや、ルータやサーバーなどの様々な機器の上に成り立っています。

CORS

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

Vite

Viteは、フロントエンド向けのビルドツール。JavaScriptはもちろん、さまざまな環境での利用が可能です。ES Modulesを利用することで高速ビルドを実現でき、ファイルの変更時も変更箇所のみを更新できるといった特徴があります。

Q&A

解決済

2回答

578閲覧

CORS 対策をしつつ、Vue3 から Rails API を呼び出したい

sutonea

総合スコア207

Vue.js

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

ネットワーク

ネットワークとは、複数のコンピューター間を接続する技術です。インターネットが最も主流なネットワークの形態で、TCP/IP・HTTP・DNSなどの様々なプロトコルや、ルータやサーバーなどの様々な機器の上に成り立っています。

CORS

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

Vite

Viteは、フロントエンド向けのビルドツール。JavaScriptはもちろん、さまざまな環境での利用が可能です。ES Modulesを利用することで高速ビルドを実現でき、ファイルの変更時も変更箇所のみを更新できるといった特徴があります。

0グッド

0クリップ

投稿2023/10/30 00:03

編集2023/10/30 22:03

実現したいこと

  • API サーバーへ GET リクエストを送り、結果を ブラウザのコンソールに表示したい

前提

Ruby on Rails で 作成した API に
Vue3 から GET リクエストを送信して、
結果をブラウザのコンソールに表示したいです。

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

ブラウザのコンソールに以下が表示されています。
Uncaught (in promise) SyntaxError: Unexpected token '<', "<!DOCTYPE "... is not valid JSON

GET http://localhost:5173/posts/1 500 (Internal Server Error)

vite.config.ts の proxy 設定に誤りがあるような気がするのですが、問題を特定できていません。

該当のソースコード

src/App.vue

typescript

1<script setup lang="ts"> 2import { RouterLink, RouterView } from 'vue-router' 3import HelloWorld from './components/HelloWorld.vue' 4import axios from 'axios' 5import { ref } from 'vue' 6 7const data = ref(null); 8fetch("http://localhost:5173/posts/1") 9.then(response => response.json()) 10.then(json => console.log(json)) 11 12</script>

vite.config.ts

typescript

1import { fileURLToPath, URL } from 'node:url' 2 3import { defineConfig } from 'vite' 4import vue from '@vitejs/plugin-vue' 5 6// https://vitejs.dev/config/ 7export default defineConfig({ 8 plugins: [ 9 vue(), 10 ], 11 resolve: { 12 alias: { 13 '@': fileURLToPath(new URL('./src', import.meta.url)) 14 } 15 }, 16 server: { 17 proxy: { // CORS 対策 18 '/posts/1': 'http://localhost/3000', 19 } 20 } 21})

試したこと

curl での動作確認結果

bash

1curl localhost:3000/posts/1 2{"id":1,"body":"ABC","created_at":"2023-10-29T12:24:31.739Z","updated_at":"2023-10-29T12:24:31.739Z"}

解決方法

サーバサイドの Rails アプリケーションに、CORSの設定が不足していました。
不足していた設定を追加することで解決しました。

ruby

1# Be sure to restart your server when you modify this file. 2 3# Avoid CORS issues when API is called from the frontend app. 4# Handle Cross-Origin Resource Sharing (CORS) in order to accept cross-origin Ajax requests. 5 6# Read more: https://github.com/cyu/rack-cors 7 8Rails.application.config.middleware.insert_before 0, Rack::Cors do 9 allow do 10 # 以下に、 http://localhost:5173 が不足していたため、追加したところ 11解決 しました 12 origins "http://localhost:3000", "http://localhost:5173" 13 14 resource "*", 15 headers: :any, 16 methods: [:get, :post, :put, :patch, :delete, :options, :head] 17 end 18end 19

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

package.json

json

1{ 2 "name": "keputonea", 3 "version": "0.0.0", 4 "private": true, 5 "scripts": { 6 "dev": "vite", 7 "build": "run-p type-check \"build-only {@}\" --", 8 "preview": "vite preview", 9 "build-only": "vite build", 10 "type-check": "vue-tsc --noEmit -p tsconfig.app.json --composite false", 11 "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore", 12 "format": "prettier --write src/" 13 }, 14 "dependencies": { 15 "axios": "^1.6.0", 16 "vue": "^3.3.4", 17 "vue-router": "^4.2.5" 18 }, 19 "devDependencies": { 20 "@rushstack/eslint-patch": "^1.3.3", 21 "@tsconfig/node18": "^18.2.2", 22 "@types/node": "^18.18.5", 23 "@vitejs/plugin-vue": "^4.4.0", 24 "@vue/eslint-config-prettier": "^8.0.0", 25 "@vue/eslint-config-typescript": "^12.0.0", 26 "@vue/tsconfig": "^0.4.0", 27 "eslint": "^8.49.0", 28 "eslint-plugin-vue": "^9.17.0", 29 "npm-run-all2": "^6.1.1", 30 "prettier": "^3.0.3", 31 "typescript": "~5.2.0", 32 "vite": "^4.4.11", 33 "vue-tsc": "^1.8.19" 34 } 35}

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

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

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

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

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

guest

回答2

0

自己解決

サーバサイドの Rails アプリケーションに、CORSの設定が不足していました。
不足していた設定を追加することで解決しました。

ruby

1# Be sure to restart your server when you modify this file. 2 3# Avoid CORS issues when API is called from the frontend app. 4# Handle Cross-Origin Resource Sharing (CORS) in order to accept cross-origin Ajax requests. 5 6# Read more: https://github.com/cyu/rack-cors 7 8Rails.application.config.middleware.insert_before 0, Rack::Cors do 9 allow do 10 # 以下に、 http://localhost:5173 が不足していたため、追加したところ解決 しました 11 origins "http://localhost:3000", "http://localhost:5173" 12 13 resource "*", 14 headers: :any, 15 methods: [:get, :post, :put, :patch, :delete, :options, :head] 16 end 17end

投稿2023/10/30 22:04

sutonea

総合スコア207

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

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

0

curlで叩いてるport番号とvueで叩いてるport番号が異なるのでは?

投稿2023/10/30 10:18

machui

総合スコア2

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

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

sutonea

2023/10/30 11:29

ありがとうございます。 試しに、vue のソースコード上のポート番号を curl で指定している 3000 に変更してみたところ、CORS に関するエラーが発生してしまいました。 ``` Access to fetch at 'http://localhost:3000/posts/1' from origin 'http://localhost:5173' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled. ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問