কেন একটি অপশন রুটে সিওআরএস শিরোলেখ যুক্ত করা ব্রাউজারগুলিকে আমার এপিআইতে অ্যাক্সেস করতে দেয় না?


653

আমি আমার নোড.জেএস অ্যাপ্লিকেশনে সিওআরএসকে সমর্থন করার চেষ্টা করছি যা এক্সপ্রেস.জেএস ওয়েব ফ্রেমওয়ার্ক ব্যবহার করে। এটি কীভাবে পরিচালনা করতে হয় সে সম্পর্কে আমি একটি গুগল গ্রুপ আলোচনা পড়েছি এবং সিওআরএস কীভাবে কাজ করে সে সম্পর্কে কয়েকটি নিবন্ধ পড়েছি। প্রথমত, আমি এটি করেছি (কোডটি কফিস্ক্রিপ্ট সিনট্যাক্সে লেখা আছে):

app.options "*", (req, res) ->
  res.header 'Access-Control-Allow-Origin', '*'
  res.header 'Access-Control-Allow-Credentials', true
  # try: 'POST, GET, PUT, DELETE, OPTIONS'
  res.header 'Access-Control-Allow-Methods', 'GET, OPTIONS'
  # try: 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept'
  res.header 'Access-Control-Allow-Headers', 'Content-Type'
  # ...

এটি কাজ করে বলে মনে হচ্ছে না। দেখে মনে হচ্ছে আমার ব্রাউজারটি (ক্রোম) প্রাথমিক বিকল্পগুলির অনুরোধ প্রেরণ করছে না। আমি যখন কেবলমাত্র সংস্থানটির জন্য ব্লকটি আপডেট করেছি তখন আমাকে ক্রস-উত্স GET অনুরোধ জমা দিতে হবে:

app.get "/somethingelse", (req, res) ->
  # ...
  res.header 'Access-Control-Allow-Origin', '*'
  res.header 'Access-Control-Allow-Credentials', true
  res.header 'Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS'
  res.header 'Access-Control-Allow-Headers', 'Content-Type'
  # ...

এটি (ক্রোমে) কাজ করে। এটি সাফারিতেও কাজ করে।

আমি এটা পড়েছি ...

সিওআর বাস্তবায়নকারী ব্রাউজারে প্রতিটি ক্রস-অরিজিন জিইটি বা পোষ্ট অনুরোধের আগে একটি অপশন অনুরোধ থাকে যা জিইটি বা পোষ্ট ঠিক আছে কিনা তা যাচাই করে।

সুতরাং আমার মূল প্রশ্নটি হল, আমার ক্ষেত্রে এটি কীভাবে ঘটবে বলে মনে হয় না? আমার app.options ব্লক কেন বলা হয় না? আমার প্রধান অ্যাপ.জেট ব্লকে আমাকে শিরোনামগুলি কেন সেট করতে হবে?


2
কফিস্ক্রিপ্টের সুবর্ণ নিয়মটি হল: "এটি কেবল জাভাস্ক্রিপ্ট"।
এসএসএইচ এই

এই উত্তর হয়তো দরকারী stackoverflow.com/a/58064366/7059557
AmirReza-Farahlagha

উত্তর:


185

আপনার মূল প্রশ্নের উত্তর দেওয়ার জন্য, সিওআরএস স্পেসের কেবলমাত্র পোস্টের আগে বা অপসারণের জন্য অপশন কল প্রয়োজন যদি পোষ্ট বা জিইটি এতে কোনও অ-সরল সামগ্রী বা শিরোলেখ থাকে।

সামগ্রী-প্রকারের জন্য যা একটি সিওআরএস পূর্ব-উড়ানের অনুরোধের (অপশন কল) প্রয়োজন হয় তা নিম্নলিখিত ব্যতীত যে কোনও সামগ্রী-প্রকার :

  1. application/x-www-form-urlencoded
  2. multipart/form-data
  3. text/plain

উপরের তালিকাবদ্ধগুলি ব্যতীত অন্য যে কোনও সামগ্রী-প্রকারগুলি পূর্ব-বিমানের অনুরোধটি ট্রিগার করবে।

শিরোনাম হিসাবে, নিম্নলিখিত ব্যতীত যে কোনও অনুরোধ শিরোনাম একটি প্রাক ফ্লাইট অনুরোধ ট্রিগার করবে:

  1. Accept
  2. Accept-Language
  3. Content-Language
  4. Content-Type
  5. DPR
  6. Save-Data
  7. Viewport-Width
  8. Width

অন্য কোনও অনুরোধ শিরোনামগুলি প্রাক-বিমানের অনুরোধটি ট্রিগার করবে।

সুতরাং, আপনি যেমন একটি কাস্টম শিরোলেখ যোগ করতে পারেন: x-Trigger: CORSএবং এটি প্রি-ফ্লাইটের অনুরোধটি ট্রিগার করে এবং অপশন ব্লকে আঘাত করতে পারে।

দেখুন MDN ওয়েব এপিআই রেফারেন্স - CORS Preflighted অনুরোধ


11
আপনি একটি উদাহরণ প্রদান করতে পারেন?
গ্লেন পিয়ার্স

3
আমি যে পৃষ্ঠাটি লিঙ্ক করেছি তাতে অনেকগুলি উদাহরণ রয়েছে বলে মনে হয়। আপনি কি বলতে পারেন যে আপনি কী উদাহরণ অনুপস্থিত?
ডাবিস ভান্ডারমির

7
যদিও সাধারণভাবে, লিঙ্ক-কেবল উত্তরগুলি ভঙ্গুর কারণ এগুলি যে কোনও মুহুর্তে ভেঙে যেতে পারে। এটি বলেছিল, এই উত্তরটি যথেষ্ট ভাল বলে মনে হচ্ছে যে এটি সাধারণ শর্তগুলি হাইলাইট করে যা OPTIONSব্লকগুলি প্রেরণ করে না। যদি এটা গৃহীত তালিকা ছিল চমৎকার হবে HEADERS, অথবা যার content-typesপ্রয়োজন OPTIONSইত্যাদি, কিন্তু এটি একটি ভাল শুরু
dwanderson

668

আমি দেখেছি সবচেয়ে সহজ উপায় Node.js প্যাকেজ ব্যবহার করা Cors । সহজ ব্যবহারটি হ'ল:

var cors = require('cors')

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

অবশ্যই আপনার প্রয়োজন অনুযায়ী আচরণটি কনফিগার করার বিভিন্ন উপায় রয়েছে; উপরের লিঙ্ক করা পৃষ্ঠাটি বেশ কয়েকটি উদাহরণ দেখায়।


1
এটি আমার পক্ষে ব্যর্থ হয় যখন আমি এটি শংসাপত্র সহ ব্যবহার করি। :( অন্য সব কিছুই মনোমুগ্ধকর মতো কাজ করেছিল .. তবে এটি যদি আমার কাছে সত্যিকারের সাথে সেট করা অনুপস্থিতির সাথে ব্যর্থ হয় তবে আমার কোনও লাভ নেই
শর্মা

এজাক্স অনুরোধের জন্য এটি কাজ করছে fine আমি স্ক্রিপ্ট ট্যাগ এবং আইফ্রেমের জন্য সিওআরএস বাস্তবায়ন চাই কারণ এই অনুরোধগুলিতে অনুরোধ শিরোনামে উত্স উপস্থিত নেই :( এটি কীভাবে প্রয়োগ করবেন?
আকাশপাত্র

59
cors({credentials: true, origin: true})
আপনাকেও

2
আপনি এখানে বিকল্পগুলি কীভাবে সক্ষম করবেন?
chovy

@ নলাওসন আহ তুমি আমাকে বাঁচিয়েছ
অ্যাডরিন

446

পরবর্তী ম্যাচের রুটে নিয়ন্ত্রণ পাস করার চেষ্টা করুন। এক্সপ্রেস প্রথম app.get রুট মিলে হয়, তাহলে এটা অপশন রুট সম্মুখের অবিরত হবে না যদি না আপনি এই কাজ করতে (পরবর্তী নোট ব্যবহার) :

app.get('somethingelse', function(req, res, next) {
    //..set headers etc.

    next();
});

সিওআরএস স্টাফগুলি সংগঠিত করার ক্ষেত্রে, আমি এটি একটি মিডওয়্যারের মধ্যে রেখেছি যা আমার পক্ষে ভাল কাজ করছে:

//CORS middleware
var allowCrossDomain = function(req, res, next) {
    res.header('Access-Control-Allow-Origin', 'example.com');
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.header('Access-Control-Allow-Headers', 'Content-Type');

    next();
}

//...
app.configure(function() {
    app.use(express.bodyParser());
    app.use(express.cookieParser());
    app.use(express.session({ secret: 'cool beans' }));
    app.use(express.methodOverride());
    app.use(allowCrossDomain);
    app.use(app.router);
    app.use(express.static(__dirname + '/public'));
});

1
আমি বিশ্বাস করি একটি জেটের আগে অপশনগুলি ঘটে যায়, আপনি যদি পোষ্ট করে থাকেন তবে কোনও বিকল্পের অনুরোধ নেই ...
নিক

21
কি config.allowedDomainsএকটি কমা দ্বারা আলাদা করা স্ট্রিং বা একটি অ্যারের?
পিক্সেলফ্রিয়াক

2
config.allowedDomains একটি স্থান পৃথক অ্যারে হওয়া উচিত
mcfedr

1
এক্সপ্রেস মিডলওয়্যারের ক্রমটি পুনরায় সাজিয়ে অতিরিক্ত সেশনটি সরানো হয়েছিল। অন্য নোটে, এর জন্য আরও কিছুটা সুরক্ষা প্রয়োজন। যদি উত্সটি অনুমোদিত ডোমেনে না থাকে তবে অনুরোধটি এখনও প্রক্রিয়া করা হয়, কেবল ব্রাউজার এটি দেখতে সক্ষম হবে না এবং উত্সটি ছদ্মবেশী হতে পারে। আমার পরামর্শটি হবে একটি চেক করা এবং যদি উত্স অনুমোদিত তালিকায় না থাকে তবে অবিলম্বে 403 ফিরে আসুন। যে কোনও সংবেদনশীল তথ্য দেওয়া হচ্ছে, একটি সেশনের মাধ্যমে ব্যবহারকারীকে বৈধতা দিন।
এক্সেরি

1
@ এমসিএফিডার আপনি কি দয়া করে ব্যাখ্যা করতে পারবেন যে স্থান দ্বারা পৃথক অ্যারে বলতে কী বোঝ?
pootzko

116

রাউটিং একই ধারণা থাকা। আমি এই কোডটি ব্যবহার করি:

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

অনুরূপ http://enable-cors.org/server_expressjs.html উদাহরণ


1
এই grunt.js ফাইল যায়?
অলিভার ডিকসন

4
প্রিফ্লাইট সম্পর্কে কী?
ব্যাকডেস্ক

না অলিভারডিকসন, এটি সার্ভারের পাশে রয়েছে
আলেকজান্দ্রে ম্যাগনো টেলস জিমেরার

84

করা

npm install cors --save

এবং কেবল আপনার প্রধান ফাইলটিতে এই লাইনগুলি যুক্ত করুন যেখানে আপনার অনুরোধ চলছে (এটি কোনও রুটের আগে রাখুন)।

const cors = require('cors');
const express = require('express');
let app = express();
app.use(cors());
app.options('*', cors());

3
app.options('*', cors())// অন্যান্য রুটের আগে অন্তর্ভুক্ত করুন
রাজেশ্বর

52

আমি এক্সপ্রেস বা সংযোগের জন্য উপযুক্ত একটি আরও সম্পূর্ণ মিডলওয়্যার তৈরি করেছি। এটি OPTIONSপ্রিফলাইট চেকিংয়ের জন্য অনুরোধগুলি সমর্থন করে । মনে রাখবেন যে এটি সিওআরএসকে যে কোনও কিছুতে অ্যাক্সেসের অনুমতি দেবে, আপনি যদি অ্যাক্সেস সীমাবদ্ধ করতে চান তবে আপনি কিছু পরীক্ষা করতে পারেন।

app.use(function(req, res, next) {
    var oneof = false;
    if(req.headers.origin) {
        res.header('Access-Control-Allow-Origin', req.headers.origin);
        oneof = true;
    }
    if(req.headers['access-control-request-method']) {
        res.header('Access-Control-Allow-Methods', req.headers['access-control-request-method']);
        oneof = true;
    }
    if(req.headers['access-control-request-headers']) {
        res.header('Access-Control-Allow-Headers', req.headers['access-control-request-headers']);
        oneof = true;
    }
    if(oneof) {
        res.header('Access-Control-Max-Age', 60 * 60 * 24 * 365);
    }

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

আরে, আমি আপনার সমাধানটি পেরিয়ে এসে ভাবছিলাম যে কোনও একটি শিরোলেখ সনাক্ত না করা থাকলে 'ওয়ানফ' পতাকাটি মিথ্যা সেট করা উচিত কিনা?
লিওনিডাস

1
কিছু অনুরোধের সমস্ত শিরোনাম থাকবে না। বিশেষত ব্রাউজারের মাধ্যমে একটি জিইটি অনুরোধ প্রেরণ করা হবে এবং যখন এটি সঠিক অনুমতি-উত্সের প্রতিক্রিয়া পায় না তখন একটি ত্রুটি জেএসকে দেওয়া হয়। যেখানে কোনও পোস্টের অনুরোধের জন্য, প্রথমে অপশন-এর অনুরোধটি অনুমতি-পদ্ধতি শিরোনাম সহ প্রেরণ করা হয় এবং তারপরেই প্রকৃত পোস্টের অনুরোধ প্রেরণ করা হবে।
mcfedr

1
আহ আমি দেখি. ধন্যবাদ। আপনি যদি কখনও জিজ্ঞাসাবাদ পদ্ধতিটি 'বিকল্পগুলি' থাকে তবে সেখানে পুনরায় বিক্রয় (200) না রেখে সমস্যার মধ্যে পড়েছেন?
লিওনিডাস

আমি মনে করি না যে আমি অন্য কিছু প্রেরণের চেষ্টা করেছি, আমি কল্পনা করব যে অন্য কোনও প্রতিক্রিয়া ব্রাউজারকে অনুরোধটি প্রত্যাখ্যান করবে যে এটি পূর্বনির্ধারিত।
mcfedr

মোহন মতো কাজ করে, আমি আরও সুরক্ষার জন্য কেবল অনুমোদিত ডোমেনগুলির একটি তালিকা যুক্ত করব
সেবাস্তিয়ান এইচ।

37

এক্সপ্রেসের কোর মডিউল ইনস্টল করুন। আপনি এই পদক্ষেপগুলি অনুসরণ করতে পারেন>

স্থাপন

npm install cors

সাধারণ ব্যবহার (সমস্ত কর অনুরোধ সক্ষম করুন)

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

আরও তথ্যের জন্য https://github.com/expressjs/cors এ যান


2
TypeError: Cannot read property 'headers' of undefinedসর্বাধিক প্রাথমিক অ্যাপ সেটআপ।
অলিভার ডিকসন

আপনি কি নিশ্চিত যে আপনার অনুরোধের বিষয়টি আছে? :)
কোডবিজেড

33

এরকম কিছু করুন:

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

20

ডিফারেন্স পোর্টে এক্সপ্রেস + নোড + আয়নিক চলমান দিয়ে পরীক্ষা করা।

Localhost:8100

Localhost:5000

// CORS (Cross-Origin Resource Sharing) headers to support Cross-site HTTP requests

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

2
কোন ফাইলটিতে আমাদের এই লাইনগুলি যুক্ত করতে হবে?
শেফালী চৌধুরী চৌধুরী

20

প্রথমে আপনার প্রকল্পে কর্স ইনস্টল করুন। টার্মিনাল (কমান্ড প্রম্পট) এবং cdআপনার প্রকল্প ডিরেক্টরিতে যান এবং নীচের কমান্ডটি চালান:

npm install cors --save

তারপরে সার্ভার.জেএস ফাইল নিন এবং এতে নিম্নলিখিতটি যুক্ত করতে কোডটি পরিবর্তন করুন:

var cors = require('cors');


var app = express();

app.use(cors());

app.use(function(req, res, next) {
   res.header("Access-Control-Allow-Origin", "*");
   res.header('Access-Control-Allow-Methods', 'DELETE, PUT, GET, POST');
   res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
   next();
});

এটি আমার পক্ষে কাজ করেছে ..


4
আপনি জিনিসগুলি corsকরছেন যদি আপনার প্রয়োজন হয় না res.headercorsএমন একটি গ্রন্থাগার যা আপনার জন্য সমস্ত কিছু পরিচালনা করে। আপনার প্রথম এবং তৃতীয় লাইন মুছে ফেলুন (এর সাথে corsএকে একে সব কিছু আছে ) এবং আপনি দেখতে পাবেন যে এটি এখনও কাজ করে।
thisissami

হেক আমি সত্যিই নিশ্চিত যে আপনার সত্যিকারের প্রয়োজন কেবল এই লাইনটিres.header("Access-Control-Allow-Origin", "*");
এটিসামি

তবে মনে রাখবেন না যে আপনি এটি করে আপনার সুরক্ষার সাথে আপস করছেন। :)
thisissami

10

এটি আমার পক্ষে কাজ করে, রুটের অভ্যন্তরে এটি সহজ বাস্তবায়ন হিসাবে, আমি মিনেজ ব্যবহার করি এবং এর কাজ সূক্ষ্ম, সাফারি, ক্রোম ইত্যাদি using

app.route('/footer-contact-form').post(emailer.sendFooterMail).options(function(req,res,next){ 
        res.header('Access-Control-Allow-Origin', '*'); 
        res.header('Access-Control-Allow-Methods', 'GET, POST');
        res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
        return res.send(200);

    });

10

কিছু সময় আগে, আমি এই সমস্যার মুখোমুখি হয়েছি তাই আমার নোডেজ অ্যাপ্লিকেশনটিতে সিওআরএসকে অনুমতি দেওয়ার জন্য এটি করেছি:

প্রথমে আপনাকে নীচের কমান্ডটি ব্যবহার করে ইনস্টল করতে হবে cors :

npm install cors --save

এখন আপনার অ্যাপ্লিকেশন শুরু করার মতো ফাইলগুলিতে নিম্নলিখিত কোডগুলি যুক্ত করুন ( app.js or server.js)

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

require('./router/index')(app);

কর্স ইনস্টল করার পরে এটি চেষ্টা করে।
কর্সগুলি কোনও

9

আমার মধ্যে index.jsআমি যোগ করেছি:

app.use((req, res, next) => {
   res.header("Access-Control-Allow-Origin", "*");
   res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
   res.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
   next();
}) 

2
আমার মন্তব্য করা উচিত এর Access-Control-Allow-Origin = *অর্থ এই যে আপনি সার্ভারে কুকিজ প্রেরণ করতে পারবেন না, সেগুলি CORS নীতি দ্বারা প্রত্যাখ্যান করা হবে - উত্স: developer.mozilla.org/en-US/docs/Web/HTTP/… । সুতরাং, আপনি কুকি ব্যবহার করতে চাইলে এটি ব্যবহার করবেন না।
একসাপসি

7

আপনি যদি এটিকে নিয়ামক নির্দিষ্ট করতে চান তবে আপনি এটি ব্যবহার করতে পারেন:

res.setHeader('X-Frame-Options', 'ALLOWALL');
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'POST, GET');
res.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');

দয়া করে নোট করুন যে এটি আইফ্রেমেসকেও অনুমতি দেবে।


6

একই জন্য নীচের কোড উল্লেখ করতে পারেন। সূত্র: একাডেমাইন্ড / নোড-বিশ্রাম-এপিআই

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

//acts as a middleware
//to handle CORS Errors
app.use((req, res, next) => { //doesn't send response just adjusts it
    res.header("Access-Control-Allow-Origin", "*") //* to give access to any origin
    res.header(
        "Access-Control-Allow-Headers",
        "Origin, X-Requested-With, Content-Type, Accept, Authorization" //to give access to all the headers provided
    );
    if(req.method === 'OPTIONS'){
        res.header('Access-Control-Allow-Methods', 'PUT, POST, PATCH, DELETE, GET'); //to give access to all the methods provided
        return res.status(200).json({});
    }
    next(); //so that other routes can take over
})

আমি অনেক উত্তর দেখেছি এবং এর কিছু রয়েছে যা আমদানি হয়, আমি কোডের এই অংশটি অন্য কয়েকটি কনফিগারেশনের পরে ব্যবহার করার চেষ্টা করেছি এবং এটি কার্যকর হয়নি এবং কোনও কারণে, আমি কোডটি অ্যাপ্লিকেশন const app = express();এবং কাজের পরে রাখার চেষ্টা করেছি ! আমি এটি উল্লেখ করা গুরুত্বপূর্ণ মনে করি।
rfcabal

4

এক্সপ্রেস ৪.২.০ সহ আমার সহজ সমাধান (সম্পাদনা: ৪.৩.০-তে কাজ করে বলে মনে হচ্ছে না):

function supportCrossOriginScript(req, res, next) {
    res.status(200);
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Content-Type");

    // res.header("Access-Control-Allow-Headers", "Origin");
    // res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    // res.header("Access-Control-Allow-Methods","POST, OPTIONS");
    // res.header("Access-Control-Allow-Methods","POST, GET, OPTIONS, DELETE, PUT, HEAD");
    // res.header("Access-Control-Max-Age","1728000");
    next();
}

// Support CORS
app.options('/result', supportCrossOriginScript);

app.post('/result', supportCrossOriginScript, function(req, res) {
    res.send('received');
    // do stuff with req
});

আমি মনে করি app.all('/result', ...)কাজগুলি খুব কাজ করবে ...


3

সবচেয়ে সহজ উত্তরটি হল কেবল প্যাকেজ ব্যবহার করা ।

const cors = require('cors');

const app = require('express')();
app.use(cors());

এটি বোর্ড জুড়ে CORS সক্ষম করবে। আপনি যদি বাইরের মডিউলগুলি ছাড়াই কীভাবে সিআরএস সক্ষম করবেন তা শিখতে চান তবে আপনার সত্যিকারের প্রয়োজন এমন কিছু এক্সপ্রেস মিডলওয়্যার যা 'অ্যাক্সেস-নিয়ন্ত্রণ-অনুমতি দিন-উত্স' শিরোনাম সেট করে । আপনার সার্ভারে একটি ব্রাউজার থেকে ক্রস-অনুরোধ ডোমেনগুলি মঞ্জুরি দেওয়ার জন্য আপনার সর্বনিম্নতম প্রয়োজন।

app.options('*', (req, res) => {
  res.set('Access-Control-Allow-Origin', '*');
  res.send('ok');
});

app.use((req, res) => {
  res.set('Access-Control-Allow-Origin', '*');
});

2

এক্সপ্রেস মিডলওয়্যার ব্যবহার করা আমার পক্ষে দুর্দান্ত কাজ করে। আপনি যদি ইতিমধ্যে এক্সপ্রেস ব্যবহার করে থাকেন তবে কেবল নীচের মিডলওয়্যার বিধিগুলি যুক্ত করুন। এটি কাজ শুরু করা উচিত।

app.all("/api/*", function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Cache-Control, Pragma, Origin, Authorization, Content-Type, X-Requested-With");
  res.header("Access-Control-Allow-Methods", "GET, PUT, POST");
  return next();
});

app.all("/api/*", function(req, res, next) {
  if (req.method.toLowerCase() !== "options") {
    return next();
  }
  return res.send(204);
});

উল্লেখ


2

নীচে আমার জন্য কাজ করেছে, আশা করি এটি কাউকে সহায়তা করে!

const express = require('express');
const cors = require('cors');
let app = express();

app.use(cors({ origin: true }));

Https://expressjs.com/en/resources/middleware/cors.html#configuring-cors থেকে রেফারেন্স পেয়েছি


এটি কোন ফাইলের মধ্যে যায়? peanutbutter.js?
অ্যান্ড্রু কোপার

চিনাবাদাম বাটার.জেএস সম্পর্কে নিশ্চিত না, আমার কাছে এটি এক্সপ্রেস.জেএস। মূলত, এটি এমন ফাইল হওয়া উচিত যেখানে আপনার এক্সপ্রেস অ্যাপ্লিকেশন প্রয়োজন, এটি আরম্ভ করা উচিত এবং রুট ফাইলের প্রয়োজন।
ভাতসাল শাহ

1

আমি এটি এনপিএম অনুরোধ প্যাকেজ ( https://www.npmjs.com/package/request ) দিয়ে এটি করা অত্যন্ত সহজ বলে মনে করেছি

তারপরে আমি আমার পোস্টটি http://blog.javascriptting.com/2015/01/17/dont-hassle-with-cors/ এ আমার সমাধানকে ভিত্তি করেছিলাম

'use strict'

const express = require('express');
const request = require('request');

let proxyConfig = {
    url : {
        base: 'http://servertoreach.com?id=',
    }
}

/* setting up and configuring node express server for the application */
let server = express();
server.set('port', 3000);


/* methods forwarded to the servertoreach proxy  */
server.use('/somethingElse', function(req, res)
{
    let url = proxyConfig.url.base + req.query.id;
    req.pipe(request(url)).pipe(res);
});


/* start the server */
server.listen(server.get('port'), function() {
    console.log('express server with a proxy listening on port ' + server.get('port'));
});

1

টাইপ করা বিষয়, আপনি ব্যবহার করতে চান তাহলে প্যাকেজ Node.js Cors

/**
* app.ts
* If you use the cors library
*/

import * as express from "express";
[...]
import * as cors from 'cors';

class App {
   public express: express.Application;

   constructor() {
       this.express = express();
       [..]
       this.handleCORSErrors();
   }

   private handleCORSErrors(): any {
       const corsOptions: cors.CorsOptions = {
           origin: 'http://example.com',
           optionsSuccessStatus: 200
       };
       this.express.use(cors(corsOptions));
   }
}

export default new App().express;

আপনি যদি কর ত্রুটি পরিচালনার জন্য তৃতীয় অংশের লাইব্রেরি ব্যবহার করতে না চান তবে আপনার হ্যান্ডেল CORSErferences () পদ্ধতিটি পরিবর্তন করতে হবে।

/**
* app.ts
* If you do not use the cors library
*/

import * as express from "express";
[...]

class App {
   public express: express.Application;

   constructor() {
       this.express = express();
       [..]
       this.handleCORSErrors();
   }

   private handleCORSErrors(): any {
       this.express.use((req, res, next) => {
           res.header("Access-Control-Allow-Origin", "*");
           res.header(
               "Access-Control-ALlow-Headers",
               "Origin, X-Requested-With, Content-Type, Accept, Authorization"
           );
           if (req.method === "OPTIONS") {
               res.header(
                   "Access-Control-Allow-Methods",
                   "PUT, POST, PATCH, GET, DELETE"
               );
               return res.status(200).json({});
           } 
           next(); // send the request to the next middleware
       });
    }
}

export default new App().express;

App.ts ফাইলটি ব্যবহারের জন্য

/**
* server.ts
*/
import * as http from "http";
import app from "./app";

const server: http.Server = http.createServer(app);

const PORT: any = process.env.PORT || 3000;
server.listen(PORT);

1
"সার্ভারটি যদি টাইপ স্ক্রিপ্টে লেখা থাকে" - এটি হয় না। প্রশ্নটি বলছে এটি কফিস্ক্রিপ্টে লেখা হয়েছে।
কুইন্টিন

1
@ কুইন্টিন আমি টাইপস্রিপ্টে একটি বিকল্প প্রদর্শন করতে চেয়েছিলাম, এই আশা করে যে এটি কারও সাহায্য করতে পারে।
পরাস্তকারী

1

আমি রেস.সেন্ডস্ট্যাটাস (200) দিয়ে যে পার্থক্যটি শেষ করেছি তার সাথে প্যাট এর উত্তরের সাথে এটি সমান; পরবর্তী () এর পরিবর্তে;

কোডটি বিকল্প প্রকারের সমস্ত অনুরোধগুলি অপশনে সনাক্ত করবে এবং অ্যাক্সেস-কন্ট্রোল-শিরোনামগুলি ফেরত পাঠাবে।

app.options('/*', (req, res, next) => {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
    res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');
    res.sendStatus(200);
});

প্রশ্নের অনুরোধ অনুযায়ী কোডটি সমস্ত উত্স থেকে সিওআরএস গ্রহণ করে। যাইহোক, * নির্দিষ্ট উত্সের সাথে HTTP: // লোকালহোস্ট: 8080 প্রতিস্থাপন করা ভাল অপব্যবহার রোধের ।

যেহেতু আমরা অ্যাপ.উপশন-পদ্ধতিটি অ্যাপের পরিবর্তে ব্যবহার করি use ব্যবহারের পদ্ধতিটি আমাদের এই চেকটি করার দরকার নেই:

req.method === 'OPTIONS'

যা আমরা অন্যান্য উত্তরগুলির কয়েকটিতে দেখতে পারি।

আমি উত্তরটি এখানে পেয়েছি: http://johnzhang.io/options-request-in-express


1

আপনি এক্সপ্রেস মিডলওয়্যার ব্যবহার করতে পারেন, আপনার ডোমেন এবং পদ্ধতিগুলি অবরুদ্ধ করতে পারেন।

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", process.env.DOMAIN); // update to match the domain you will make the request from
  res.header("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE");
  res.header(
    "Access-Control-Allow-Headers",
    "Origin, X-Requested-With, Content-Type, Accept"
  );
  next();
});

এটি আমার সমস্যার সাথে আমাকে সহায়তা করেছে, ধন্যবাদ!
Fr0zenOfiial

0

আমরা CORS এড়াতে এবং অনুরোধগুলি পরিবর্তে অন্য সার্ভারে ফরোয়ার্ড করতে পারি:

// config:
var public_folder = __dirname + '/public'
var apiServerHost = 'http://other.server'

// code:
console.log("starting server...");

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

// serve static files
app.use(express.static(public_folder));

// if not found, serve from another server
app.use(function(req, res) {
    var url = apiServerHost + req.url;
    req.pipe(request(url)).pipe(res);
});

app.listen(80, function(){
    console.log("server ready");
});

1
এটি জিজ্ঞাসিত প্রশ্নের উত্তর দেয় না
ডেভিড.বারখুইজেন

0

আমি আমার ওয়েব অ্যাপ্লিকেশনটিতে নিম্নলিখিত পদক্ষেপগুলি ব্যবহার করেছি এবং আমার সাফল্য পেয়েছে:

এক্সপ্রেসে কর্স প্যাকেজ যুক্ত করুন:

npm install cors --save

বডি পার্সার কনফিগারেশনের পরে নিম্নলিখিত লাইনগুলি যুক্ত করুন । বডি পার্সারের আগে যোগ করতে আমার কিছুটা সমস্যা হয়েছিল:

 // enable cors to the server
const corsOpt = {
    origin: process.env.CORS_ALLOW_ORIGIN || '*', // this work well to configure origin url in the server
    methods: ['GET', 'PUT', 'POST', 'DELETE', 'OPTIONS'], // to works well with web app, OPTIONS is required
    allowedHeaders: ['Content-Type', 'Authorization'] // allow json and token in the headers
};
app.use(cors(corsOpt)); // cors for all the routes of the application
app.options('*', cors(corsOpt)); // automatic cors gen for HTTP verbs in all routes, This can be redundant but I kept to be sure that will always work.

0

সবচেয়ে সহজ পদ্ধতির সাহায্যে আপনার প্রকল্পে কর্স মডিউলটি ইনস্টল করে:

npm i --save cors

তারপরে আপনার সার্ভার ফাইলটিতে এটি ব্যবহার করে আমদানি করুন:

import cors from 'cors';

তারপরে এটিকে মিডলওয়্যার হিসাবে কেবল এটি ব্যবহার করুন:

app.use(cors());

আশাকরি এটা সাহায্য করবে!


0

আমি যদি আপনি ওপি থাকতেন তবে আমি আমার প্রোগ্রামিং দৃষ্টান্তটি পরিবর্তন করতাম।

ধরে নিচ্ছেন যে আপনি এই কর্সকে অবরুদ্ধ করছেন কারণ আপনি লোকালহোস্ট বা অনুরূপ কিছু অনুরোধ করছেন।

অবশেষে যদি আপনি প্রডাক্ট অপটিনগুলিতে Google Cloud Platformবা এর মতো স্থাপন করতে চলেছেন তবে, আপনাকে কোনও উত্সের অনুমোদনের মতো বা উত্পাদনের সময় সিআরএস Herokuসম্পর্কে চিন্তা করতে হবে না।

সুতরাং সার্ভারটি পরীক্ষা করার সময় কেবল ব্যবহার করুন postmanএবং আপনি সিওআরএস ব্লক পাবেন না, এর পরে আপনার সার্ভারটি স্থাপন করুন এবং তারপরে আপনার ক্লায়েন্টের সাথে কাজ করুন।


0

/ * সবার আগে, এবং এটি আমার মতো জুনিয়র দেবদের মধ্যে সমস্যা হতে পারে: আপনার লঞ্চ পদ্ধতিতে "ল্যাম্বদা" >>>> "` "নয়" "" ব্যবহার নিশ্চিত করুন ! * /

response `` দৃ`় প্রতিক্রিয়া = আনার অপেক্ষা করা ( https://api....);

/ প্লাস, নিম্নলিখিত নিবন্ধটি অত্যন্ত প্রস্তাবিত: https://developer.edamam.com/api/faq /


0

সহজ কঠিন:

 let my_data = []
const promise = new Promise(async function (resolve, reject) {
    axios.post('https://cors-anywhere.herokuapp.com/https://maps.googleapis.com/maps/api/directions/json?origin=33.69057660000001,72.9782724&destination=33.691478,%2072.978594&key=AIzaSyApzbs5QDJOnEObdSBN_Cmln5ZWxx323vA'
        , { 'Origin': 'https://localhost:3000' })
        .then(function (response) {
            console.log(`axios response ${response.data}`)
            const my_data = response.data
            resolve(my_data)
        })
        .catch(function (error) {
            console.log(error)
            alert('connection error')
        })
})
promise.then(data => {
    console.log(JSON.stringify(data))
})

0

আপনার প্রধান জেএস ফাইলটিতে এটি ব্যবহার করে দেখুন:

app.use((req, res, next) => {
res.header("Access-Control-Allow-Origin", "*");
res.header(
  "Access-Control-Allow-Headers",
  "Authorization, X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Allow-Request-Method"
);
res.header("Access-Control-Allow-Methods", "GET, POST, OPTIONS, PUT, DELETE");
res.header("Allow", "GET, POST, OPTIONS, PUT, DELETE");
next();
});

এটা আপনার সমস্যা সমাধান করবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.