2017-08-27 15 views
5

Tôi đang chạy API Lumen (5.3) qua $ php -S localhost:8888 -t public khi tôi nhấn bất kỳ điểm cuối nào thông qua người đưa thư hoạt động mà không bị lỗi. Tuy nhiên, khi tôi cố gắng cuộn tròn localhost: 8888/v1/auth/login ví dụ tôi đưa ra các lỗi sau:yêu cầu proxy tạo phản ứng-ứng dụng để trợ giúp php

curl: (7) Failed to connect to localhost port 8888: Connection refused

tôi đã làm một số poking xung quanh trước khi đặt câu hỏi này và một số người dùng nói rằng tôi có thể cần để kích hoạt CORS cho một số tuyến đường của tôi. Vì vậy, tôi đã đi trước và cài đặt https://github.com/barryvdh/laravel-cors#lumen và áp dụng nó cho tất cả các tuyến đường.

Tuy nhiên, tôi vẫn không thể nhấn bất kỳ điểm cuối nào từ cửa sổ đầu cuối của mình.

The End Goal

Cuối cùng, mục tiêu là để yêu cầu proxy từ một ứng dụng phản ứng với lumen phụ trợ, nhưng tôi cứ bị kết nối từ chối.

console errors

network tab

Proxy error: Could not proxy request /v1/auth/login from localhost:3000 to http://localhost:8888/ . See https://nodejs.org/api/errors.html#errors_common_system_errors for more information (ECONNREFUSED).

Có thể mà tôi đã định cấu hình các middleware xử lý CORS trong lumen?

Cập nhật

tôi quản lý để phản ứng của tôi ứng dụng để thực hiện một yêu cầu API lumen của tôi bằng cách chỉ cần tiêm đường dẫn đầy đủ trong yêu cầu. Ví dụ: thay vì /v1/auth/login đường dẫn bây giờ là http://localhost:8888/v1/auth/login. Tôi quản lý để có được điều này để làm việc bằng cách thêm mode: 'no-cors' để lấy tôi:

function login(userData, onError, cb) { 
    return fetch('http://localhost:8888/v1/auth/login', { 
    mode: 'no-cors', 
    method: 'post', 
    body: JSON.stringify(userData), 
    headers: { 
     'Accept': 'application/json', 
     'Content-Type': 'application/json', 
    }, 
    }).then(checkStatus) 
    .then(parseJSON) 
    .then(cb) 
    .catch(onError); 
} 

Nếu không có chế độ: không CORS

Without mode: no-cors

Lý tưởng nhất là tôi chỉ muốn return fetch('/v1/auth/login', { và proxy yêu cầu mà không cần mode: no-cors nhưng điều này dường như không hoạt động. Bất kỳ ý tưởng tại sao?

Ngoài ra, vấn đề với curl vẫn còn tồn tại.

+0

Nếu Lumen từ chối yêu cầu khi CORS không được kích hoạt, điều đó bị hỏng — bởi vì các hiệu ứng duy nhất trên hệ thống máy chủ cho phép CORS có trên hệ thống máy chủ đó chỉ làm cho nó gửi 'Access-Control-Allow-Origin 'tiêu đề phản hồi và các tiêu đề' Access-Control- * 'khác. Không bật CORS sẽ không khiến máy chủ từ chối yêu cầu; thay vì CORS đi, nơi duy nhất mà bất kỳ việc chặn nào xảy ra là ở phía máy khách, nơi các trình duyệt sẽ chặn mã lối vào của bạn truy cập phản hồi đến yêu cầu có nguồn gốc chéo trừ khi phản hồi có 'Access-Control-Allow-Origin' header – sideshowbarker

+1

Theo như 'mode: 'no-cors'', có hai hiệu ứng có. Đầu tiên là, nó ngăn cản mã lối vào của bạn thêm bất kỳ tiêu đề "tùy chỉnh" nào vào yêu cầu — trong đó 'Content-Type: application/json' được định nghĩa là một trong các tiêu đề trong danh mục đó. Tác động thứ hai là, nó yêu cầu các trình duyệt chặn mã lối vào của bạn truy cập vào phản hồi, trong mọi trường hợp. Vì vậy, trong mã trong câu hỏi, các hiệu ứng là: Yêu cầu đó được gửi tới máy chủ mà không có tiêu đề 'Content-Type: application/json' và khi máy chủ gửi phản hồi trở lại, trình duyệt chặn mã đó truy cập vào nó. – sideshowbarker

+1

Tôi không biết nguyên nhân gây ra sự cố mà bạn thấy với curl nhưng nếu mục tiêu của bạn là nhận được phản hồi cho các yêu cầu POST đến điểm cuối đó, và điều đó chỉ hoạt động khi bạn sử dụng 'chế độ: 'no-cors'', cho biết yêu cầu OPTIONS CORS preflight yêu cầu trình duyệt gửi trước POST (do tiêu đề 'Content-Type: application/json') không thành công, hoặc máy chủ không gửi header phản hồi Access-Control-Allow-Origin. Lưu ý rằng ngay cả khi CORS không được bật đúng trên máy chủ, yêu cầu POST đó vẫn có thể thành công — chỉ là trình duyệt sẽ không cho phép mã của bạn truy cập phản hồi. – sideshowbarker

Trả lời

2

Nó chỉ ra rằng bằng cách bắt đầu phụ trợ php của tôi với $ php -S localhost:8888 -t public đã gây ra gánh nặng của vấn đề. Sau khi tìm hiểu thông qua các vấn đề về ứng dụng tạo phản ứng, tôi thấy rằng một người dùng gặp sự cố tương tự với một chương trình phụ trợ php (https://github.com/facebookincubator/create-react-app/issues/800).

Giải pháp là khởi động máy chủ như vậy: $ php -S 0.0.0.0:8888 -t public điều này sẽ cho phép tạo phản ứng-ứng dụng cho đúng yêu cầu proxy tới máy chủ php. Điều này cũng cho phép tôi curl localhost:8888

Thêm vào đó, tôi cần phải bỏ ghi chú always_populate_raw_post_data = -1 trong file php.ini của tôi mỗi (Warning about `$HTTP_RAW_POST_DATA` being deprecated)

Thiết lập của tôi như sau:

gói.json

{ 
    "name": "client", 
    "version": "0.4.2", 
    "private": true, 
    "devDependencies": { 
    "enzyme": "^2.6.0", 
    "react-addons-test-utils": "^15.4.1", 
    "react-scripts": "0.7.0" 
    }, 
    "dependencies": { 
    "isomorphic-fetch": "^2.2.1", 
    "react": "^15.4.1", 
    "react-dom": "^15.4.1", 
    "react-router-dom": "^4.2.2" 
    }, 
    "scripts": { 
    "start": "react-scripts start", 
    "build": "react-scripts build", 
    "test": "react-scripts test --env=jsdom", 
    "eject": "react-scripts eject" 
    }, 
    "proxy": "http://localhost:8888/" 
} 

lấy từ client-side

function login(userData, onError, cb) { 
    return fetch('/v1/auth/login', { // <-- this works correctly now 
    method: 'post', 
    body: JSON.stringify(userData), 
    headers: { 
     'Accept': 'application/json', 
     'Content-Type': 'application/json', 
    }, 
    }).then(checkStatus) 
    .then(parseJSON) 
    .then(cb) 
    .catch(onError); 
} 

Hy vọng rằng điều này sẽ giúp bất cứ ai khác gặp phải sự cố tương tự.

Các vấn đề liên quan