前提
初めまして、読んでいただきありがとうございます。
フロントエンドをAngular、バックエンドをLaravelで開発を行っております。
開発にはDockerを導入しております。
開発環境
環境
- windows 11
- Docker version 20.10.17
- Docker Compose version 2.7.0
- Angular CLI: 14.2.3
- typescript 4.7.4
- PHP 8.1.11
- Laravel Framework 9.31.0
- Laravel Sanctum
docker-compose container一覧
- php
- nginx
- mysql
- node.js(Angular14)
- 番号リスト
実現したいこと
フロントエンドとバックエンドをつなげたい。(Laravel側のAPIを実行したい)
現在AngularとLaravelのアプリをdocker-composerにて開発をしております。
開発時は以下の工程を実行しております。
- $docker-compose up -d を使用して、コンテナを起動
- node.jsのコンテナで ng serve --proxy-config proxy.conf.json --host 0.0.0.0 --pollを実行
- Angular側からLaravel側に対し、request※1を行う。
- エラーメッセージが表示される
※1 requestのURLは(1)~(2)の方法で指定しております。
http://localhost:8080/api/login
(1) proxy.conf.jsonで http://localhost:8080/api までを指定
(2) login.service.tsで/api/loginを指定
→/apiを付けることで、先頭のurlを http://localhost:8080/api に変更する
3番のリクエストを正しく飛ばせるようにしたい。
フロントエンドURL
http://localhost:4200
バックエンドURL(nginxのURL)
http://localhost:8080
発生している問題・エラーメッセージ
下記エラーによって、Angular側からのリクエストが
Laravelに到達しておりません。
[webpack-dev-server] [HPM] Error occurred while proxying request localhost:4200/api/login to http://localhost:8080/api [ECONNREFUSED] (https://nodejs.org/api/errors.html#errors_common_system_errors)
該当のソースコード
Docker-compose.yml
Docker
1version: '3' 2 3services: 4 php: 5 build: 6 context: . 7 dockerfile: ./php/Dockerfile 8 volumes: 9 - ./src/:/php 10 web: 11 build: 12 context: . 13 dockerfile: ./nginx/Dockerfile 14 ports: 15 - 8080:80 16 depends_on: 17 - php 18 volumes: 19 - ./src/:/php 20 21 mysql: 22 build: 23 context: . 24 dockerfile: ./mysql/Dockerfile 25 ports: 26 - 3307:3306 27 env_file: .env.dev 28 environment: 29 TZ: 'Asia/Tokyo' 30 volumes: 31 - mysql-volume:/var/lib/mysql 32 node: 33 build: 34 context: . 35 dockerfile: ./node/Dockerfile 36 working_dir: /frontend 37 ports: 38 - 4200:4200 39 volumes: 40 - ./frontend:/frontend 41 tty: true 42 43volumes: 44 mysql-volume: 45 name: database-volumes
proxy.conf.json
proxy.conf.json
1{ 2 "/api": { 3 "target": "http://localhost:8080", 4 "secure": false 5 } 6}
login.service.ts
login.service.ts
1import { catchError, Observable, of, tap } from 'rxjs'; 2import { ApiConst } from 'src/app/common/constants/api-const'; 3 4import { HttpClient } from '@angular/common/http'; 5import { Injectable } from '@angular/core'; 6 7import { LoginRequestDto } from '../models/dtos/requests/login-request-dto'; 8import { LoginResponseDto } from '../models/dtos/responses/login-response-dto'; 9 10@Injectable({ 11 providedIn: 'root' 12}) 13export class LoginService { 14 15 constructor( 16 private http: HttpClient, 17 ) { } 18 19 public login(loginRequestDto:LoginRequestDto): Observable<LoginResponseDto> { 20 return this.http.post<LoginResponseDto>(ApiConst.SLASH + ApiConst.API + ApiConst.SLASH + ApiConst.LOGIN, loginRequestDto) 21 .pipe( 22 catchError(() => { 23 return of(null as unknown as LoginResponseDto); 24 }) 25 ); 26 } 27 28} 29
cors.php
cors.php
1<?php 2 3return [ 4 'paths' => [ 5 'api/*', 6 'login', 7 'logout', 8 'sanctum/csrf-cookie' 9 ], 10 11 'allowed_methods' => ['*'], 12 13 'allowed_origins' => ['*'], 14 15 'allowed_origins_patterns' => [], 16 17 'allowed_headers' => ['*'], 18 19 'exposed_headers' => [], 20 21 'max_age' => 0, 22 23 'supports_credentials' => true, 24 25];
Route/api.php
api.php
1<?php 2 3use App\Http\Controllers\API\Auth\LoginController; 4use Illuminate\Http\Request; 5use Illuminate\Support\Facades\Route; 6 7Route::middleware('auth:sanctum')->get('/user', function (Request $request) { 8 return $request->user(); 9}); 10 11Route::post('/login', [LoginController::class, 'authenticate']);
RouteServiceProvider.php
1<?php 2 3namespace App\Providers; 4 5use Illuminate\Cache\RateLimiting\Limit; 6use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider; 7use Illuminate\Http\Request; 8use Illuminate\Support\Facades\RateLimiter; 9use Illuminate\Support\Facades\Route; 10 11class RouteServiceProvider extends ServiceProvider 12{ 13 public function boot() 14 { 15 $this->configureRateLimiting(); 16 17 $this->routes(function () { 18 Route::middleware('api') 19 ->prefix('api') 20 ->group(base_path('routes/api.php')); 21 }); 22 } 23
試したこと
-
proxy.conf.jsonを "target": "http://web:8080" に書き換え実行→失敗
-
PostmanからLaravelのApiURLを実行→成功
参考にしたURL
- https://hsuzuki.hatenablog.com/entry/2019/10/25/170856
- https://zenn.dev/nagi125/articles/7d01336868c79654b4af
- https://pokuwagata.hatenablog.com/entry/2019/07/28/191649
コメント
現在、corsの知識やDockerのネットワークの知識を入れているのですが、
解決できずにいます。
わかる方がいましたらご回答よろしくお願いいたします。
※初投稿となります。至らない点がありましたら、コメントで教えていただけると助かります。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。