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

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

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

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

JavaScript

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

CORS

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

Q&A

解決済

1回答

9022閲覧

Nuxt.jsで複数サーバにAPIの問い合わせをローカルで行いたい

shuheq

総合スコア15

Nuxt.js

Nuxt.jsは、ユニバーサルなSPAが開発可能なVue.jsベースのフレームワーク。UIの描画サポートに特化しており、SSRにおけるサーバーサイドとクライアントサイドのUIレンダリングなどさまざまな機能を持ちます。

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

JavaScript

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

CORS

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

0グッド

2クリップ

投稿2020/04/28 10:06

編集2020/04/29 05:14

前提・実現したいこと

Nuxt.jsでAxiosを使用しAPI通信を行っています。
今回、WordpressのAPIと、バックエンドをGoで作成したマイページのAPIを同時に叩きたいです。

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

それぞれのバックエンドのlocalhostのオリジンが違うため、
両方のCORSエラーに対応することができない状況です。
(Go:3001ポート、WP:8080ポート)
どうしてもaxiosのbaseURLに指定している localhost:3001 へAPI通信をしに行ってしまいます。
もし同じ状況で解決された方がいらっしゃれば、お知恵お借りしたいです。
(APIは片方だけ叩くのは問題ありません。)

CORSエラーは一般的なCORSエラーと思います。

Access to XMLHttpRequest at 'http://localhost:8080/wp-json/wp/v2/posts/' from origin 'http://localhost:3000' has been blocked by CORS policy: Request header field access-control-allow-origin is not allowed by Access-Control-Allow-Headers in preflight response.

試したこと

nuxt.config.jsに下記記載してみましたが、ダメそうでした。
proxyの理解が正しくないのかもしれませんが…。

js

1 modules: [ 2 '@nuxtjs/axios', 3 '@nuxtjs/proxy' 4 ], 5 axios: { 6 proxy: true 7 }, 8 proxy: { 9 '/api/': 'http://localhost:3001', 10 '/wp-json/': 'http://localhost:8080' 11 },

別途、 plugins/axios.js に下記コードを記載してあります。
下記の baseURL の記載をなくしてしまうと、Node(Nuxt)が動いている 3000ポートへアクセスします。

axios.defaults.baseURL = 'http://localhost:3001' axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8' axios.defaults.headers['Access-Control-Allow-Origin'] = '*'

APIを叩く際にフルパスで下記のようにすると、axiosのbaseURLで指定していないほうがCORSエラーとなります。

let { postData } = await axios.get('http://localhost:8080/wp-json/wp/v2/posts/') let { data } = await axios.get('http://localhost:3001/api/v1/favorites')

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

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

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

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

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

yukapome789

2020/04/28 14:51

文章から読み取れなかったので確認なのですが、WordpressのAPIと、Goで作成したマイページのAPI、片方だけ叩く場合は問題なくて、両方叩こうとするとだめって話ですよね?(そもそもaxios使えてるのかを確認したい)
shuheq

2020/04/28 15:02

コメントありがとうございます。その通りです。 片方を叩く場合は問題ありません。
yukapome789

2020/04/29 03:47

やったことないので試してみてくださいとしか言えないのですが、 ・nuxt.config.jsのmodulesに何指定してるか見たいです。可能であれば(隠したいところは隠して)nuxt.config.js全体を貼ってください。 ・もしmodulesに '@nuxtjs/proxy' が入ってなかったら追加してみてください。 ・baseURLは消したほうが良さそうです。(下記のWARNINGより) https://axios.nuxtjs.org/options.html#baseurl
shuheq

2020/04/29 04:04 編集

modulesは下記になります。 今回は小規模からスモールスタートしようとしてるサービスなので、現状ではまだ、configではほとんど何も行っていないです。 modules: [ '@nuxtjs/axios', '@nuxtjs/proxy' ], npm でのインストールも完了しており、使用できないといったエラーは出ません。 > ・baseURLは消したほうが良さそうです。(下記のWARNINGより) ありがとうございます! こちらは消してみて影響がないかなども見ておりますが、消してしまうと、どのAPIもNuxt.js(nodeが3000ポートで動いてます)のサーバへ問い合わせしてしまいます。
yukapome789

2020/04/29 04:27

情報追加ありがとうございます。実際にaxiosを使っているところが記載されていませんが、例えばAPI叩く時にフルパスで(つまりhttp://localhost:3001 や http://localhost:8080で)書くと両方叩けますか?
yukapome789

2020/04/29 04:40

矢継ぎに申し訳ないのですが、あとCORSのエラーが出ている、と仰っているエラーの内容も貼ってください。
shuheq

2020/04/29 05:12

コメントありがとうございます。 APIを叩く際にフルパスで下記のようにすると、axiosのbaseURLで指定していないほうがCORSエラーとなります。(baseURLを指定していないと、nodeの3000ポートとの通信になり、CORSエラーが出るという旨のエラーが出てしまいます。) let { postData } = await axios.get('http://localhost:8080/wp-json/wp/v2/posts/') let { data } = await axios.get('http://localhost:3001/api/v1/favorites')
yukapome789

2020/04/30 00:30

ありがとうございます。情報追加いただいたところ申し訳ないのですが、自分は力になれなさそうです。何かわかったことがあればコメントしますね。
shuheq

2020/04/30 04:45

とんでもないです。 色々と情報を追記したことにより、内容に厚みが出たと思います。 何か判明したことがあれば、コメントいただけると幸いです!
shuheq

2020/05/01 02:38

コメントありがとうございます。 確かにその通りだと思います。週末にその方向で修正してみようと思っています。 問題が解決したら自己解決につけます。ありがとうございます!
guest

回答1

0

自己解決

下記のようなpluginsファイルを作り解決しました。
指摘いただいたように、baseURL毎に各インスタンスを作成して回避しています。

js

1import Vue from 'vue' 2import axios from 'axios' 3 4const goaxiosConfig = { 5 baseURL: 'http://localhost:3001/api/v1', 6 timeout: 30000 7} 8Vue.prototype.$goaxios = axios.create(goaxiosConfig) 9 10const wpaxiosConfig = { 11 baseURL: 'http://localhost:8080/wp-json/wp/v2', 12 timeout: 30000 13} 14Vue.prototype.$wpaxios = axios.create(wpaxiosConfig)

呼び出す際は下記のように使います。

vue

1let postData = this.$wpaxios.get('/posts') 2 → http://localhost:8080/wp-json/wp/v2/posts が呼び出される

今回は http://localhost:3001/ のようにベタ書きになってしまっているので、
環境変数で管理するなどにして、デプロイ時にも耐えれるようにすると良いと思います。

投稿2020/05/11 08:52

shuheq

総合スコア15

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問