実現したいこと
- 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}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。