2017-08-27 30 views
5

我通過$ php -S localhost:8888 -t public運行流明(5.3)API時,我通過郵遞員打任何端點它沒有失敗。然而,當我試着捲曲本地主機:8888/V1/auth /中例如登錄我提示以下錯誤:創建反應代理請求到php後端

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

我做了一些問這個問題,一些用戶說,我可能需要之前閒逛爲我的一些路線啓用CORS。所以我繼續安裝https://github.com/barryvdh/laravel-cors#lumen並將其應用於所有路線。

但是,我仍然無法從終端窗口點擊任何終端。

最終目標

最終目標是從反應應用到管腔後端代理請求,但我不斷收到拒絕連接。

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).

是否有可能,我錯誤地配置在管腔手柄CORS中間件?

更新

我設法我的反應由應用程序只在注射請求的完整路徑,使我流明API的請求。例如,而不是/v1/auth/login路徑現在是http://localhost:8888/v1/auth/login。我設法得到這種通過增加mode: 'no-cors'我取的工作:

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); 
} 

無模式:無CORS

Without mode: no-cors

理想我只想return fetch('/v1/auth/login', {和代理的請求,而不模式:no-cors,但這似乎沒有工作。任何想法爲什麼?

此外,捲曲問題仍然存在。

+0

如果Lumen在CORS未啓用的情況下拒絕請求,則會中斷 - 因爲啓用CORS的服務器系統上的唯一影響應該在該服務器系統上產生,只會導致它發送「Access-Control-Allow-Origin '響應頭和其他'Access-Control- *'頭。不啓用CORS不應導致服務器拒絕請求;相反,就CORS而言,阻塞發生的唯一地方是在客戶端,瀏覽器將阻止你的前端代碼訪問對跨源請求的響應,除非響應具有「Access-Control-Allow-Origin」頭文件 – sideshowbarker

+1

至於'mode:'no-cors'',有兩個效果。首先,它會阻止你的前端代碼將任何「自定義」頭添加到請求中,其中「Content-Type:application/json」被定義爲該類別中的頭部之一。第二個效果是,它告訴瀏覽器在任何情況下都阻止您的前端代碼訪問響應。因此,在問題中的代碼中,效果是:該請求被髮送到服務器而沒有「Content-Type:application/json」頭,並且當服務器將響應發回時,瀏覽器阻止該代碼訪問它。 – sideshowbarker

+1

我不知道是什麼原因導致了你使用curl看到的問題,但是如果你的目標是成功地獲得對該端點的POST請求的響應,&只有當你使用'mode:'no-cors''時纔有效,指示在POST之前瀏覽器發送的CORS預檢OPTIONS請求(由於Content-Type:application/json頭)失敗,或者服務器沒有發送訪問控制允許原始響應頭。請注意,即使CORS在服務器上未正確啓用,POST請求仍然可以成功 - 只是瀏覽器不會讓您的代碼訪問響應。 – sideshowbarker

回答

2

事實證明,通過啓動我的php後端$ php -S localhost:8888 -t public是造成問題的首當其衝。在深入研究create-react-app的問題之後,我發現一個用戶遇到了類似於php後端的問題(https://github.com/facebookincubator/create-react-app/issues/800)。

解決方案是啓動服務器,如下所示:$ php -S 0.0.0.0:8888 -t public這將允許create-react-app正確代理請求到php服務器。這也讓我curl localhost:8888

此外,我需要在每(Warning about `$HTTP_RAW_POST_DATA` being deprecated

我的設置如下我的php.ini文件以取消always_populate_raw_post_data = -1

包。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/" 
} 

從客戶端

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); 
} 

取希望這將有助於其他人遇到了類似的問題。