एक्सप्रेस.जेएस फ्रेमवर्क को नोड.जेएस पर क्रॉस-ऑरिजनल रिसोर्स शेयरिंग (कोर) कैसे सक्षम करें


101

मैं नोड में एक वेब सर्वर बनाने की कोशिश कर रहा हूं। जेएस एक क्रॉस-डोमेन स्क्रिप्टिंग का समर्थन करेगा, जबकि अभी भी एक सार्वजनिक निर्देशिका से स्थिर फाइलें प्रदान कर रहा है। मैं express.js का उपयोग कर रहा हूं और वास्तव में सुनिश्चित नहीं हूं कि क्रॉस-डोमेन स्क्रिप्टिंग ( Access-Control-Allow-Origin: *) की अनुमति कैसे दें ।

मैंने यह पोस्ट देखी , जो मुझे मददगार नहीं लगी।

var express = require('express')
  , app = express.createServer();

app.get('/', function (req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "X-Requested-With");
    next();
});

app.configure(function () {
    app.use(express.methodOverride());
    app.use(express.bodyParser());
    app.use(app.router);
});

app.configure('development', function () {

    app.use(express.static(__dirname + '/public'));
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

app.configure('production', function () {


    var oneYear = 31557600000;
    //    app.use(express.static(__dirname + '/public', { maxAge: oneYear }));
    app.use(express.static(__dirname + '/public'));
    app.use(express.errorHandler());
});

app.listen(8888);
console.log('express running at http://localhost:%d', 8888);

App.all vs app.get पर ध्यान दें। यह विकल्प है कि GET नहीं
शिमोन डूडकिन

एक साधारण नोड के एक उदाहरण के लिए स्थानीय-वेब-सर्वर देखें , स्थैतिक वेबसर्वर जो CORS का समर्थन करता है
लॉयड

अधिक जानकारी के लिए enable-cors.org/server_apache.html देखें
Mostafa

"Access-Control-Allow-Origin", "*"फ़िशिंग ऐप्स के लिए आपका API दिलचस्प है। केवल ज्ञात मूल की अनुमति देने पर विचार करें।
मार्टिन श्नाइडर

जवाबों:


159

की जाँच करें enable-cors.org से उदाहरण :

नोड पर अपने ExpressJS ऐप में, अपने मार्गों के साथ निम्न कार्य करें:

app.all('/', function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With");
  next();
 });

app.get('/', function(req, res, next) {
  // Handle the get for this route
});

app.post('/', function(req, res, next) {
 // Handle the post for this route
});

पहली कॉल ( app.all) आपके ऐप में अन्य सभी मार्गों से पहले की जानी चाहिए (या कम से कम जिन्हें आप कोरस सक्षम होना चाहते हैं)।

[संपादित करें]

यदि आप चाहते हैं कि हेडर स्थिर फ़ाइलों के लिए भी दिखाए जाएं, तो यह कोशिश करें: (कॉल से पहले यह सुनिश्चित कर लें use(express.static()):

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "X-Requested-With");
  next();
});

मैंने आपके कोड के साथ इसका परीक्षण किया, और publicनिर्देशिका से संपत्ति पर शीर्ष लेख प्राप्त किया :

var express = require('express')
  , app = express.createServer();

app.configure(function () {
    app.use(express.methodOverride());
    app.use(express.bodyParser());
    app.use(function(req, res, next) {
      res.header("Access-Control-Allow-Origin", "*");
      res.header("Access-Control-Allow-Headers", "X-Requested-With");
      next();
    });
    app.use(app.router);
});

app.configure('development', function () {
    app.use(express.static(__dirname + '/public'));
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

app.configure('production', function () {
    app.use(express.static(__dirname + '/public'));
    app.use(express.errorHandler());
});

app.listen(8888);
console.log('express running at http://localhost:%d', 8888);

आप निश्चित रूप से एक मॉड्यूल में फ़ंक्शन को पैकेज कर सकते हैं ताकि आप कुछ ऐसा कर सकें

// cors.js

module.exports = function() {
  return function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "X-Requested-With");
    next();
  };
}

// server.js

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

अरे, आपकी प्रतिक्रिया के लिए धन्यवाद। मैंने वही किया जो आपने सुझाया था (पहला भाग, लेकिन फिर भी अनुरोध हेडर में कोई भिन्न नहीं दिखता) मैंने अपना वर्तमान कोड ऊपर संलग्न किया है। क्या आप बता सकते हैं कि मैं आपके बाकी समाधान को कैसे एकीकृत कर सकता हूं?
गाइ

1
मुझे लगता है कि हैरान कर रहा हूँ, जब से तुम कर रहे हैं useing app.routerपहले express.staticकि यह स्थिर फ़ाइलों के लिए हेडर संशोधित नहीं करता है; किसी भी स्थिति में, मैंने अपना उत्तर अपडेट कर दिया है ताकि यह काम करे।
मिशेल टाइली

धन्यवाद! मैं देख रहा हूं कि आप सही हैं। सर्वर से प्राप्त संपत्ति अनुरोधित हेडर के साथ हैं। मैं अपने असली मुद्दे के बारे में स्पष्ट नहीं हो पाया। मैं कमांड प्राप्त करने के साथ बाहरी सर्वर पर एक एपीआई कॉल करने की कोशिश कर रहा हूं। और यही वह जगह है जहां मुझे त्रुटि मिलती है: XMLHttpRequest SOMEURL.com लोड नहीं कर सकता । ओरिजिनल लोकलहोस्ट: 8888 को एक्सेस-कंट्रोल-अनुमति-ओरिजिन द्वारा अनुमति नहीं है।
गाइ

मुझे गलतफहमी हो सकती है। क्या आप SOMEURL.com पर सर्वर के नियंत्रण में हैं?
मिशेल टाइली

क्षमा करें, मैं अब आपके उत्तर को पूरी तरह से समझता हूं। बहुत बहुत धन्यवाद। मैं आपकी मदद की सराहना करता हूँ :)
लड़के

58

@ मिचेल टिली समाधान के बाद, जाहिर तौर पर यह मेरे लिए पहले काम नहीं करता था। निश्चित नहीं कि क्यों, शायद मैं क्रोम और नोड के विभिन्न संस्करण का उपयोग कर रहा हूं। कुछ छोटी-मोटी बातें करने के बाद, यह अब मेरे लिए काम कर रही है।

app.all('*', function(req, res, next) {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
  res.header('Access-Control-Allow-Headers', 'Content-Type');
  next();
});

यदि कोई मेरा है, तो यह मददगार हो सकता है।


App.all vs app.get पर ध्यान दें। यह विकल्प है कि GET नहीं
शिमोन डूडकिन

यह मेरे लिए काम करता है (मैं बैकबोन का उपयोग करके ऑब्जेक्ट ला रहा हूं)। मैं यह पता लगाने की कोशिश कर रहा हूं कि क्या यह IE 8 में काम करेगा ... ऐसा लगता है जैसे यह होना चाहिए, लेकिन मुझे नहीं पता कि क्या इस "एक्सडोमेनरैसेस्ट" चीज के लिए कुछ विशेष आवश्यक है ... developer.mozilla.org/en- यूएस / डॉक्स / HTTP /…
एडम लविंग

भविष्य के उपयोगकर्ताओं के लिए कुछ जानकारी: मैं अपने डोमेन नाम को एक हिक्सो रेपो के लिए फिर से निर्देशित कर रहा हूं, यही कारण है कि मैं इस मुद्दे में चल रहा था। वैसे भी, पहले जवाब ने स्थानीय रूप से काम किया था, लेकिन मैंने उसे हेरोकू में धकेलने के बाद नहीं। हालाँकि इस जवाब ने हरोकू को धक्का देने के बाद काम किया।
क्रिस होलेनबेक

@KrisHollenbeck यह मेरे लिए हरकू पर काम नहीं करता, क्या आपने कुछ और किया?
बेन क्रेग

@BenCraig, नहीं, लेकिन यह वास्तव में पहली कोशिश के बाद मेरे लिए काम करना बंद कर दिया। तो मैं वास्तव में अभी भी इस समस्या के रूप में अच्छी तरह से कर रहा हूँ।
क्रिस होलेनबेक

11

इस cors npm मॉड्यूल की कोशिश करें ।

var cors = require('cors')

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

यह मॉड्यूल ठीक ट्यून करने के लिए कई सुविधाएँ प्रदान करता है जैसे डोमेन व्हाइटलाइनिंग, विशिष्ट एपिस के लिए कॉर्स को सक्षम करना आदि।


2

मैं इसका उपयोग करता हूं:

var app = express();

app
.use(function(req, res, next){
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Headers', 'X-Requested-With');
    next();
})
.options('*', function(req, res, next){
    res.end();
})
;

h.readFiles('controllers').forEach(function(file){
  require('./controllers/' + file)(app);
})
;

app.listen(port);
console.log('server listening on port ' + port);

यह कोड मानता है कि आपके नियंत्रक नियंत्रक निर्देशिका में स्थित हैं। इस निर्देशिका की प्रत्येक फ़ाइल कुछ इस तरह होनी चाहिए:

module.exports = function(app){

    app.get('/', function(req, res, next){
        res.end('hi');
    });

}

1

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


0

Access-Control-Allow-Credentials: trueयदि आप "क्रेडेंशियल्स" के माध्यम से "कुकी" का उपयोग करना चाहते हैं, तो आपको सेट करना होगा

app.all('*', function(req, res, next) {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Credentials', true);
  res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
  res.header('Access-Control-Allow-Headers', 'Content-Type');
  next();
});

0
app.use(function(req, res, next) {
var allowedOrigins = [
  "http://localhost:4200"
];
var origin = req.headers.origin;
console.log(origin)
console.log(allowedOrigins.indexOf(origin) > -1)
// Website you wish to allow to
if (allowedOrigins.indexOf(origin) > -1) {
  res.setHeader("Access-Control-Allow-Origin", origin);
}

// res.setHeader("Access-Control-Allow-Origin", "http://localhost:4200");

// 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,Authorization"
);

// 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();

});

इस कोड को अपने index.js या server.js फ़ाइल में जोड़ें और अपनी आवश्यकता के अनुसार अनुमत मूल सरणी को बदलें।


-6

एक अतिरिक्त कदम जो मुझे उठाने की जरूरत थी वह था अपने URL को से स्विच http://localhostकरनाhttp://127.0.0.0


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