2017-08-27 20 views
5

पर create-react-app प्रॉक्सी अनुरोध $ php -S localhost:8888 -t public के माध्यम से मैं लुमेन (5.3) एपीआई चला रहा हूं जब मैंने पोस्टमैन के माध्यम से कोई एंडपॉइंट मारा है तो यह असफल होने के बिना काम करता है। हालांकि, जब मैं स्थानीय होस्ट कर्ल करने की कोशिश: 8888/v1/प्रमाणन/उदाहरण के लिए लॉगिन मैं कर रहा हूँ निम्न त्रुटि दिया:php बैकएंड

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

मैंने किया था कुछ इस सवाल पूछने और कुछ उपयोगकर्ताओं को कह रहे थे कि मैं आवश्यकता हो सकती है इससे पहले कि आसपास poking मेरे कुछ मार्गों के लिए सीओआरएस सक्षम करने के लिए। तो मैं आगे बढ़ गया और 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 मिडलवेयर को गलत कॉन्फ़िगर किया गया है?

अद्यतन

मैं अपने आवेदन सिर्फ अनुरोध में पूर्ण पथ इंजेक्शन लगाने के द्वारा मेरे लुमेन एपीआई के लिए अनुरोध करने के लिए प्रतिक्रिया करने में कामयाब रहे। उदाहरण के लिए, /v1/auth/login के बजाय पथ अब http://localhost:8888/v1/auth/login है।

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

मोड के बिना :: मैं यह मेरा लाने के लिए mode: 'no-cors' जोड़कर काम करने के लिए पाने में कामयाब रहे कोई CORS

Without mode: no-cors

आदर्श रूप में मैं करूंगा बस return fetch('/v1/auth/login', { करने और प्रॉक्सी अनुरोध की तरह बिना मोड: नो-कॉर्स लेकिन यह काम नहीं कर रहा प्रतीत होता है। कोई विचार क्यों?

इसके अलावा, कर्ल के साथ समस्या अभी भी बनी हुई है।

+0

लुमेन अनुरोध जब CORS सक्षम नहीं है, कि टूट-क्योंकि है यह 'पहुंच-नियंत्रण-अनुमति दें-उत्पत्ति भेजने के लिए एक सर्वर सिस्टम पर केवल प्रभाव है कि सक्षम करने CORS कि सर्वर सिस्टम पर होना चाहिए सिर्फ पैदा करने के लिए कर रहे हैं को खारिज कर दिया है, तो 'प्रतिक्रिया हेडर और अन्य' एक्सेस-कंट्रोल- * हेडर। सीओआरएस सक्षम नहीं होने से सर्वर को अनुरोधों को मना कर देना नहीं चाहिए; बजाय जहाँ तक CORS चला जाता है के रूप में, केवल जगह किसी भी अवरुद्ध होता है ग्राहक के पक्ष में, जहां ब्राउज़रों एक क्रॉस मूल अनुरोध के जवाब तक पहुँचने जब तक प्रतिक्रिया एक 'पहुंच-नियंत्रण-अनुमति दें-Origin' है से अपने दृश्यपटल कोड को अवरुद्ध कर देगा पर है – sideshowbarker

+1

शीर्षक 'मोड के रूप में जहाँ तक: 'कोई cors'', वहाँ दो असर पड़ता है कि कर रहे हैं। आवेदन/json' उस श्रेणी में हेडर से एक के रूप में परिभाषित किया गया है: पहले यह एक अनुरोध-जहां 'सामग्री प्रकार के लिए किसी भी" कस्टम "शीर्षलेख जोड़कर से अपने दृश्यपटल कोड से बचाता है। दूसरा प्रभाव यह है कि यह ब्राउज़र को आपके परिसर कोड को सभी परिस्थितियों में प्रतिक्रिया तक पहुंचने से रोकने के लिए कहता है। तो सवाल में कोड में, प्रभाव हैं: तक पहुँचने से आवेदन/json' हेडर, और सर्वर प्रतिक्रिया वापस भेजता है, ब्राउज़र ब्लॉक कि कोड: यह अनुरोध के बिना 'सामग्री प्रकार सर्वर के लिए भेजा जाता है। – sideshowbarker

+1

मुझे नहीं पता कि आप कर्ल के साथ क्या समस्या पैदा कर रहे हैं, लेकिन यदि आपका लक्ष्य उस एंडपॉइंट पर POST अनुरोधों के लिए सफलतापूर्वक प्रतिक्रिया प्राप्त करने के लिए है, और यह केवल तब काम करता है जब आप 'मोड:' नो-कॉर्स 'का उपयोग करते हैं, जो ऐसा प्रतीत होता है इंगित करता है कि सीओआरएस प्रीफलाइट विकल्प अनुरोध करते हैं कि ब्राउज़र POST से पहले भेजता है ('सामग्री-प्रकार: एप्लिकेशन/जेसन' हेडर के कारण) विफल रहता है, या सर्वर एक्सेस-कंट्रोल-अनुमति-उत्पत्ति प्रतिक्रिया शीर्षलेख नहीं भेज रहा है। ध्यान दें कि सर्वर पर CORS ठीक से सक्षम नहीं है, तो भी POST अनुरोध अभी भी सफल हो सकता है-यह केवल इतना है कि ब्राउज़र आपके कोड को प्रतिक्रिया तक पहुंचने नहीं देगा। – sideshowbarker

उत्तर

2

यह पता चला है कि $ php -S localhost:8888 -t public के साथ मेरा PHP बैकएंड शुरू करके समस्या का शिकार हो रहा था। क्रिएट-रिएक्ट-एप मुद्दों के माध्यम से खोदने के बाद मुझे पता चला कि एक उपयोगकर्ता को PHP बैकएंड (https://github.com/facebookincubator/create-react-app/issues/800) के साथ एक ही समस्या हो रही थी।

समाधान इस तरह से सर्वर शुरू करना है: $ php -S 0.0.0.0:8888 -t public यह php सर्वर पर ठीक-प्रॉक्सी अनुरोधों के लिए create-react-app को अनुमति देगा। यह भी साथ ही curl localhost:8888

करने के लिए मुझे अनुमति दी है, मैं प्रति (Warning about `$HTTP_RAW_POST_DATA` being deprecated)

मेरे सेटअप इस प्रकार मेरी php.ini फ़ाइल में always_populate_raw_post_data = -1 uncomment करने की जरूरत:

पैकेज।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); 
} 

से ला नहीं उम्मीद है कि इस किसी और को एक समान समस्या का सामना करने में मदद मिलेगी।