कोई 'प्रवेश-नियंत्रण-अनुमति-उत्पत्ति' - नोड / अपाचे पोर्ट समस्या


260

मैंने Node / Express का उपयोग करके एक छोटा सा API बनाया है और Angularjs का उपयोग करके डेटा खींचने की कोशिश कर रहा हूं, लेकिन जैसा कि मेरा html पेज लोकलहोस्ट पर अपाचे के तहत चल रहा है: 8888 और नोड API पोर्ट 3000 पर सुनो, मुझे 'एक्सेस-कंट्रोल' नहीं मिल रहा है अनुमति दें-उत्पत्ति '। मैंने node-http-proxyव्हाट्स अपाचे का उपयोग करने की कोशिश की लेकिन ज्यादा सक्सेज नहीं होने के कारण, कृपया नीचे पूर्ण त्रुटि और कोड देखें।

XMLHttpRequest स्थानीय होस्ट लोड नहीं कर सकता: 3000। अनुरोधित संसाधन पर कोई 'एक्सेस-कंट्रोल-अनुमति-उत्पत्ति' हेडर मौजूद नहीं है। मूल 'लोकलहोस्ट: 8888' को इसलिए प्रवेश की अनुमति नहीं है। "

// Api Using Node/Express    
var express = require('express');
var app = express();
var contractors = [
    {   
     "id": "1", 
        "name": "Joe Blogg",
        "Weeks": 3,
        "Photo": "1.png"
    }
];

app.use(express.bodyParser());

app.get('/', function(req, res) {
  res.json(contractors);
});
app.listen(process.env.PORT || 3000);
console.log('Server is running on Port 3000')

कोणीय कोड

angular.module('contractorsApp', [])
.controller('ContractorsCtrl', function($scope, $http,$routeParams) {

   $http.get('localhost:3000').then(function(response) {
       var data = response.data;
       $scope.contractors = data;
   })

एचटीएमएल

<body ng-app="contractorsApp">
    <div ng-controller="ContractorsCtrl"> 
        <ul>
            <li ng-repeat="person in contractors">{{person.name}}</li>
        </ul>
    </div>
</body>

जवाबों:


621

अपने NodeJS / एक्सप्रेस ऐप में निम्न मिडलवेयर जोड़ने का प्रयास करें (मैंने आपकी सुविधा के लिए कुछ टिप्पणियां जोड़ी हैं):

// Add headers
app.use(function (req, res, next) {

    // Website you wish to allow to connect
    res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8888');

    // Request methods you wish to allow
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');

    // Request headers you wish to allow
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');

    // Set to true if you need the website to include cookies in the requests sent
    // to the API (e.g. in case you use sessions)
    res.setHeader('Access-Control-Allow-Credentials', true);

    // Pass to next layer of middleware
    next();
});

उम्मीद है की वो मदद करदे!


2
क्या आप यह निर्दिष्ट करने में सहायता कर सकते हैं कि वह कहाँ जाता है? मेरे सर्वर में निम्नलिखित कोड है। क्या इसके बाद सही हो जाता है? var app = आवश्यकता ('एक्सप्रेस') (), सर्वर = आवश्यकता ('http')। createServer (ऐप), io = आवश्यकता ('सॉकेट.io')। सुनो (सर्वर), अनुरोध = आवश्यकता ("अनुरोध")। , url = आवश्यकता ("url"); server.listen (6969); // यह यहाँ जाता है? एक नई लाइन पर?
आर्ट गीगेल

1
@jvememo क्या मुझे app.get ('/', function (req, res) को ... function (req, res, next) में बदलना है?
संग्राम सिंह

10
आप अभी मेरे पसंदीदा व्यक्ति हैं। धन्यवाद। क्या हम इस बात को नोट कर सकते हैं कि यह कोड मेरे जैसे नॉब्स के लिए मार्गों को परिभाषित करने से पहले होना है?
जीगिलम

1
अनुरोध मॉड्यूल का उपयोग करते हुए यह काम कैसे करें?
रोहित तिग्गा

2
यह मेरे मामले में काम नहीं किया। अभी भी यह त्रुटि हो रही है: "प्रीफ़लाइट अनुरोध का जवाब एक्सेस कंट्रोल चेक पास नहीं करता है: अनुरोधित संसाधन पर कोई 'एक्सेस-कंट्रोल-अनुमति-उत्पत्ति' हेडर मौजूद नहीं है। इसलिए मूल ' abc.xyz.net:212 ' की अनुमति नहीं है। पहुँच। प्रतिक्रिया में HTTP स्थिति कोड 500 था। "
user1451111

96

स्वीकृत उत्तर ठीक है, यदि आप कुछ कम पसंद करते हैं, तो आप एक्सप्रेस के लिए उपलब्ध cors नामक एक प्लगइन का उपयोग कर सकते हैं

इस विशेष मामले के लिए, इसका उपयोग करना सरल है:

var cors = require('cors');

// use it before all route definitions
app.use(cors({origin: 'http://localhost:8888'}));

3
मुझे {origin: 'null'}काम करने के लिए इसका उपयोग करना पड़ा ... जाहिर है, मेरा ब्राउज़र nullमूल के रूप में भेजता है ?
रिकार्डो क्रूज़

2
पहिया को क्यों मजबूत करें। मैं हमेशा कोड स्निपेट की तुलना में एक पैकेज्ड समाधान के लिए हूं
पियरे

मीठी छोटी सी लाइब्रेरी जो अलग-अलग मूल से अलग-अलग तरीकों की इच्छा के मेरे उपयोग के मामले को काफी अच्छी तरह से संभालती थी ... और अगले आदमी को देखने के लिए कम कोड की थकान।
काइल बेकर

6
धन्यवाद, app.use(cors({origin: '*'}));मेरे लिए सक्षम- प्रति के रूप में काम किया ।
डैनियलक

2
मेरा सुझाव है कि इसका बेहतर उपयोग करने के लिए npm cors पेज पर एक नज़र डालें । इसने मेरे लिए चीजों को बहुत स्पष्ट कर दिया =)।
13013SwagR

30

एक और तरीका है, बस हेडर को अपने रूट में जोड़ें:

router.get('/', function(req, res) {
    res.setHeader('Access-Control-Allow-Origin', '*');
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE'); // If needed
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type'); // If needed
    res.setHeader('Access-Control-Allow-Credentials', true); // If needed

    res.send('cors problem fixed:)');
});

8
)स्माइली ने मुझे भ्रमित किया
di'cho

17

शीर्ष जवाब मेरे लिए ठीक काम किया, सिवाय इसके कि मैं श्वेत सूची एक से अधिक डोमेन की जरूरत है।

इसके अलावा, शीर्ष उत्तर इस तथ्य से ग्रस्त है कि OPTIONSअनुरोध मिडलवेयर द्वारा नियंत्रित नहीं किया गया है और आप इसे स्वचालित रूप से प्राप्त नहीं करते हैं।

मैं allowed_originsएक्सप्रेस कॉन्फ़िगरेशन के रूप में श्वेतसूची वाले डोमेन संग्रहीत करता हूं और originशीर्ष लेख के अनुसार सही डोमेन रखता हूं क्योंकि Access-Control-Allow-Originएक से अधिक डोमेन निर्दिष्ट करने की अनुमति नहीं देता है।

यहाँ मैंने क्या किया:

var _ = require('underscore');

function allowCrossDomain(req, res, next) {
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');

  var origin = req.headers.origin;
  if (_.contains(app.get('allowed_origins'), origin)) {
    res.setHeader('Access-Control-Allow-Origin', origin);
  }

  if (req.method === 'OPTIONS') {
    res.send(200);
  } else {
    next();
  }
}

app.configure(function () {
  app.use(express.logger());
  app.use(express.bodyParser());
  app.use(allowCrossDomain);
});

क्या यह वही है, यदि (app.get ('अनुमत मूल')। indexOf (मूल)! == - 1)? '
रुना जेप्पेसेन

13

उत्तर कोड केवल लोकलहोस्ट को अनुमति देता है: 8888। यह कोड उत्पादन, या अलग सर्वर और पोर्ट नाम पर तैनात नहीं किया जा सकता है।

इसे सभी स्रोतों के लिए काम करने के लिए, इसके बजाय इसका उपयोग करें:

// Add headers
app.use(function (req, res, next) {

    // Website you wish to allow to connect
    res.setHeader('Access-Control-Allow-Origin', '*');

    // Request methods you wish to allow
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');

    // Request headers you wish to allow
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');

    // Set to true if you need the website to include cookies in the requests sent
    // to the API (e.g. in case you use sessions)
    res.setHeader('Access-Control-Allow-Credentials', true);

    // Pass to next layer of middleware
    next();
});

2
यह मेरे लिए काम नहीं करता है! * "मान्य मूल नहीं है"। ऐसा लगता है कि * चरित्र को वाइल्डकार्ड के रूप में मान्यता नहीं मिली है।
फ्रांसेस्को

इससे मेरा काम बनता है। यानी वाइल्ड कार्ड '*' का उपयोग करना। क्रोम और सफारी दोनों के लिए काम करता है।
अनबिस

धन्यवाद;) ठीक काम करता है
मौरो

9

अपनी परियोजना में कोर निर्भरता स्थापित करें:

npm i --save cors

अपने सर्वर कॉन्फ़िगरेशन में निम्नलिखित को जोड़ें:

var cors = require('cors');
app.use(cors());

यह मेरे लिए 2.8.4 cors वर्जन के साथ काम करता है।


"cors": "^2.8.5", "express": "^4.16.3",ठीक लाइन @monikaja के साथ काम करने का सुझाव दिया। धन्यवाद!
RamiroIsBack 20

यह क्या करता है सभी मूल / डोमेन को एप्लिकेशन तक पहुंचने में सक्षम करने के लिए जो कुछ ऐसा है जो आप आमतौर पर नहीं करना चाहते हैं। इसके बजाय केवल अनुमत डोमेन निर्दिष्ट करें।
लाचो तोमोव

7

इसने मेरे लिए काम किया।

app.get('/', function (req, res) {

    res.header("Access-Control-Allow-Origin", "*");
    res.send('hello world')
})

आप अपनी आवश्यकताओं को पूरा करने के लिए * बदल सकते हैं। उम्मीद है कि यह मदद कर सकता है।


7

नमस्ते यह तब होता है जब फ्रंट एंड बैकएंड अलग-अलग पोर्ट पर चल रहा होता है। ब्राउज़र कॉर्स हेडर पर अनुपस्थिति के कारण बैकएंड से प्रतिक्रियाओं को अवरुद्ध करता है। समाधान बैकेंड अनुरोध में कॉर्स हेडर जोड़ने के लिए है। सबसे आसान तरीका cors npm पैकेज का उपयोग करना है।

var express = require('express')
var cors = require('cors')
var app = express()
app.use(cors())

यह आपके सभी अनुरोधों में कॉर्स हेडर को सक्षम करेगा। अधिक जानकारी के लिए आप cors प्रलेखन का उल्लेख कर सकते हैं

https://www.npmjs.com/package/cors


3
app.all('*', function(req, res,next) {
    /**
     * Response settings
     * @type {Object}
     */
    var responseSettings = {
        "AccessControlAllowOrigin": req.headers.origin,
        "AccessControlAllowHeaders": "Content-Type,X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5,  Date, X-Api-Version, X-File-Name",
        "AccessControlAllowMethods": "POST, GET, PUT, DELETE, OPTIONS",
        "AccessControlAllowCredentials": true
    };

    /**
     * Headers
     */
    res.header("Access-Control-Allow-Credentials", responseSettings.AccessControlAllowCredentials);
    res.header("Access-Control-Allow-Origin",  responseSettings.AccessControlAllowOrigin);
    res.header("Access-Control-Allow-Headers", (req.headers['access-control-request-headers']) ? req.headers['access-control-request-headers'] : "x-requested-with");
    res.header("Access-Control-Allow-Methods", (req.headers['access-control-request-method']) ? req.headers['access-control-request-method'] : responseSettings.AccessControlAllowMethods);

    if ('OPTIONS' == req.method) {
        res.send(200);
    }
    else {
        next();
    }


});

2

कोड में निम्नलिखित कोड जोड़ें। एनओडीजेजे बाकी के एपीजे को कोणीय 6 या किसी अन्य ढांचे में "एक्सेस-कंट्रोल-अनुमति-उत्पत्ति" त्रुटि से बचने के लिए।

var express = require('express');
var app = express();

var cors = require('cors');
var bodyParser = require('body-parser');

//enables cors
app.use(cors({
  'allowedHeaders': ['sessionId', 'Content-Type'],
  'exposedHeaders': ['sessionId'],
  'origin': '*',
  'methods': 'GET,HEAD,PUT,PATCH,POST,DELETE',
  'preflightContinue': false
}));

1

आप "$ http.jsonp" का उपयोग कर सकते हैं

या

नीचे स्थानीय परीक्षण के लिए क्रोम के लिए काम है

आपको निम्न आदेश के साथ अपना क्रोम खोलने की आवश्यकता है। (प्रेस विंडो + आर)

Chrome.exe --allow-file-access-from-files

नोट: आपका क्रोम खुला नहीं होना चाहिए। जब आप इस कमांड को चलाते हैं तो क्रोम अपने आप खुल जाएगा।

यदि आप कमांड प्रॉम्प्ट में इस कमांड को दर्ज कर रहे हैं तो अपने क्रोम इंस्टॉलेशन डायरेक्टरी का चयन करें।

मैक में ओपन क्रोम के लिए स्क्रिप्ट कोड के साथ "- -लो-फाइल-एक्सेस-फ्रॉम-फाइल्स"

set chromePath to POSIX path of "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" 
set switch to " --allow-file-access-from-files"
do shell script (quoted form of chromePath) & switch & " > /dev/null 2>&1 &"

दूसरा विकल्प

आप केवल झंडे जोड़ने के लिए खुले (1) का उपयोग कर सकते हैं : खुले -a 'Google Chrome' --args --allow-file-access-from-files


मैक पर कैसे? Chrome.exe --allow-file-access-from-files
user1336103

/ अनुप्रयोग / गूगल \ Chrome.app/Contents/MacOS/Google \ क्रोम --allow-फाइल एक्सेस-से-फ़ाइलों खुला क्रोम के लिए प्रबंधन, लेकिन संदेश अभी भी दिख रहा है "XMLHttpRequest लोड नहीं कर सकता स्थानीय होस्ट: 3000 । उत्पत्ति स्थानीय होस्ट: 8888 है एक्सेस-कंट्रोल-अनुमति-उत्पत्ति द्वारा अनुमति नहीं है। "
user1336103

+1 मैं 'ओपन' का उपयोग करके मैक विकल्प के साथ इस काम की पुष्टि कर सकता हूं। मेरा मामला थोड़ा अलग है क्योंकि मैं पूरी तरह से डाउनलोड की गई साइट का परीक्षण कर रहा हूं जो कुछ स्थानीय JSON फाइलों तक पहुंचती है।
Spong

0

/**
 * Allow cross origin to access our /public directory from any site.
 * Make sure this header option is defined before defining of static path to /public directory
 */
expressApp.use('/public',function(req, res, next) {
    res.setHeader("Access-Control-Allow-Origin", "*");
    // Request headers you wish to allow
    res.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    // Set to true if you need the website to include cookies in the requests sent
    res.setHeader('Access-Control-Allow-Credentials', true);
    // Pass to next layer of middleware
    next();
});


/**
 * Server is about set up. Now track for css/js/images request from the 
 * browser directly. Send static resources from "./public" directory. 
 */
expressApp.use('/public', express.static(path.join(__dirname, 'public')));
If you want to set Access-Control-Allow-Origin to a specific static directory you can set the following.

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.