হেরোকুতে একটি এক্সপ্রেস / নোড.জেএস অ্যাপ্লিকেশনটির জন্য সিওআরএস REST অনুরোধের অনুমতি দিন


98

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

প্রথম অনুরোধটি জাভাস্ক্রিপ্টের সামনের প্রান্তে স্বয়ংক্রিয়ভাবে তৈরি হয়েছে / এপিআই / অনুসন্ধান? ইউরি =, এবং "প্রিফলাইট" বিকল্পগুলির অনুরোধে ব্যর্থ হয়েছে বলে মনে হচ্ছে।

আমার এক্সপ্রেস অ্যাপে, আমি ব্যবহার করে CORS শিরোনাম যুক্ত করছি:

var allowCrossDomain = function(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');

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

এবং:

app.configure(function () {
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(allowCrossDomain);
  app.use(express.static(path.join(application_root, "public")));
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

Chrome কনসোল থেকে আমি এই শিরোলেখগুলি পেয়েছি:

ইউআরএলটির অনুরোধ করুন: http: //furious-night-5419.herokuapp.com/api/search? Uri = http% 3A% 2F% 2Flocalhost% 3A5000% 2FCલેક્શન% 2F1% 2Fdocuments% 2F1

অনুরোধের পদ্ধতি: বিকল্পগুলি

স্থিতি কোড: 200 ঠিক আছে

অনুরোধ শিরোনাম

Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Access-Control-Request-Headers:origin, x-annotator-auth-token, accept
Access-Control-Request-Method:GET
Connection:keep-alive
Host:furious-night-5419.herokuapp.com
Origin:http://localhost:5000
Referer:http://localhost:5000/collections/1/documents/1
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5

স্ট্রিং প্যারামিটারগুলি অনুসন্ধান করুন

uri:http://localhost:5000/collections/1/documents/1

প্রতিক্রিয়া শিরোনাম

Allow:GET
Connection:keep-alive
Content-Length:3
Content-Type:text/html; charset=utf-8
X-Powered-By:Express

এআইপি অ্যাপ্লিকেশন দ্বারা প্রেরণ করা উপযুক্ত শিরোনামের অভাবের মতো দেখাচ্ছে কি?

ধন্যবাদ


আমি লিখি নি এমন কোডে আমি এই ত্রুটিটি পাচ্ছি, তবে আমি OPTIONSপদ্ধতির জন্য কোনও হ্যান্ডলারের প্রয়োজনীয়তা বুঝতে পারি না । কেউ দয়া করে আমাকে বুঝতে সাহায্য করতে পারেন যে কেন POSTউভয় POST এবং OPTIONS পদ্ধতি উভয়ই পরিচালনা করার পরিবর্তে কেবল পদ্ধতিটি পরিচালনা করছেন না ?
ইউলিসেস আলভেস

PATCHআপনি যদি PUTকোনও উত্স আপডেট করার পরিবর্তে এটি ব্যবহার করেন তবে তা অন্তর্ভুক্ত করতেও পারে
ড্যানি

উত্তর:


66

আমি আপনার কোডটি একটি পরিষ্কার এক্সপ্রেসজেএস অ্যাপে চেক করেছি এবং এটি ঠিক কাজ করে।

আপনার app.use(allowCrossDomain)কনফিগার ফাংশন শীর্ষে সরানোর চেষ্টা করুন ।


8
এটি করার কারণটি হ'ল app.use(app.router);চিয়ার্সের আগে আপনার এটি সংজ্ঞায়িত করা দরকার !
মিশাল

আমার ক্ষেত্রে, পরবর্তী পোস্টটি পুনরায় পাঠানোর পরে কল করা হবে না যখন পুনঃসংশ্লিষ্ট (200) যখন req.method == 'অপশন'। আমি কি আর কিছু মিস করছি?
অ্যাল্ডো

2 অ্যাল্ডো: কোড দরকার। আপনি কিছু হেডার ভুলে যেতে পারে? আপনার সার্ভারটি সঠিকভাবে একটি প্রিফ্লাইট অপশন অনুরোধ সরবরাহ করার পরে যদি আপনার ক্লায়েন্ট কোনও পোস্ট পাঠাচ্ছে না, তবে বিকাশকারী সরঞ্জামের কনসোলটি পরীক্ষা করার চেষ্টা করুন। ওয়েবকিট ওয়েব পরিদর্শকের কনসোলে এই জাতীয় ত্রুটিগুলি লগ করে।
ওলিগাস

4
পছন্দ করুন আমি উপরের মতো অনুমতি ক্রসডোমেন পদ্ধতির কাজটি করে যাচ্ছিলাম এবং সমস্ত শিরোলেখী মিলিগ্রামটি নিয়ে কাজ করে ক্লান্ত হয়ে পড়েছিলাম। এছাড়াও - যেহেতু কেবলমাত্র দেবের জন্য আমাদের কেবল করসের প্রয়োজন ছিল, তাই কী ঘটছে তা নির্ধারণের জন্য এতগুলি চক্র উত্সর্গ করার কোনও ধারণা তৈরি করা যাচ্ছিল না। খুশি হ'ল সহজেই এটিকে অনুমতি দেওয়ার জন্য নোড.জেএস সমর্থন রয়েছে support
স্টিভেন

4
@ কননরলিচ আমার মনে হয় আপনার উত্তরটি হিসাবে আপনার মন্তব্য যুক্ত করা উচিত ... একটি ট্রিটের মতো কাজ করে, এবং এটি দুর্দান্ত এবং সহজ
drmrbrewer

4

ক্রেডিটেনশিয়াল সহ কুকি সমর্থন করার জন্য আপনার এই লাইনটি দরকার xhr.withCredentials = true;

mdn ডক্স xhr.withCredentials

এক্সপ্রেস সার্ভারে অন্য সমস্তগুলির আগে এই ব্লকটি যুক্ত করুন

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

4

আমি এটিকে কেবল উত্তর হিসাবে যুক্ত করছি কারণ মূল পোস্টটি একটি মন্তব্য হিসাবে দেওয়া হয়েছিল এবং যেমন এটি প্রথমবার যখন আমি এই পৃষ্ঠাটিতে গিয়েছিলাম তখন আপনার দ্বারা এটি উপেক্ষা করা হয়েছিল।

@ কননরলিচ উপরের গৃহীত উত্তরের মন্তব্যে যেমন উল্লেখ করেছেন, সেখানে খুব কার্যকর এনপিএম প্যাকেজ বলা হয়েছে, অবাক হওয়ার মতো নয়, কর্স । এটি ব্যবহারের মতোই সহজ var cors = require('cors'); app.use(cors());(আবারও মিঃ লেচের উত্তর থেকে আঁকড়ে ধরা হয়েছে) এবং তাদের ডক্সে বর্ণিত আরও কঠোর, আরও কনফিগারযোগ্য ফ্যাশনে প্রয়োগ করা যেতে পারে

এটি উল্লেখ করার মতোও হতে পারে যে আমি উপরে উল্লিখিত মূল মন্তব্যটি ২০১৪ সালে হয়েছিল It's এটি এখন 2019 এবং এনপিএম প্যাকেজের গিথুব পৃষ্ঠার দিকে তাকিয়ে রেপোটি সম্প্রতি নয় দিন আগে আপডেট হয়েছিল।


0

বেশিরভাগ লোকেরা এই প্রশ্নটি ব্রাউজ করছে এমন ক্ষেত্রে এটি হতে পারে না তবে আমার এই একই সমস্যাটি ছিল এবং সমাধানটির সাথে সম্পর্কিত ছিল না CORS

দেখা যাচ্ছে যে JSON ওয়েব টোকেন গোপন stringপরিবেশের ভেরিয়েবলগুলিতে সংজ্ঞায়িত করা হয়নি, তাই টোকেনটি স্বাক্ষর করা যায়নি। এটি এমন কোনও POSTঅনুরোধের কারণ হতে পারে যা একটি টাইমআউট পেতে এবং একটি 503ত্রুটি ফিরিয়ে দেওয়ার জন্য একটি টোকেন চেক বা স্বাক্ষর করার উপর নির্ভর করে , ব্রাউজারকে বলছে যে এতে কিছু ভুল আছে CORS, যা তা নয়। হেরোকুতে পরিবেশের পরিবর্তনশীল যুক্ত করা সমস্যার সমাধান করেছে।

আমি আশা করি এটা কারো সাহায্যে লাগবে.


হ্যাঁ আমার সাথে সমস্যা ছিল। আপনি কীভাবে সমস্যার সমাধান করেছেন তা আরও সুনির্দিষ্ট হতে পারে। আমি এখনও উন্নয়নে আছি এবং এক্সপ্রেস.জেএস ডাব্লু / নোড কর্স প্যাকেজটিতে চলছে।
অ্যালান

@ অ্যালান আমি আমার আবেদনে টোকেন যাচাই করার প্রতিশ্রুতি ব্যবহার করছিলাম, কিছু কীভাবে যদি জেডাব্লুটিটির গোপন সংজ্ঞা দেওয়া হয় না, প্রতিশ্রুতি কখনই সমাধান হবে না, আপনার যদি আরও রেফারেন্সের প্রয়োজন হয় তবে আমি এখানে কোডটি ব্যবহার করছি।
CatBrownie

সাড়া দেওয়ার জন্য ধন্যবাদ। আমি কোড ওভার দেখতে হবে। গোপনে আমি ধরে নিয়েছি আপনি দ্বিতীয় ব্যক্তিগত কী সম্পর্কে কথা বলছেন। আমি oauth2 ব্যবহার করছি।
অ্যালান

আমি যুক্ত করব যে কোনও ব্যর্থ প্রতিশ্রুতি এই বিভ্রান্তিকর ত্রুটি উত্পন্ন করবে! নোড সংস্করণটি ব্যবহার করা হচ্ছে সে সম্পর্কে আমাকে স্পষ্ট করে জানাতে হবে বা অন্যথায় আমার ডাটাবেস কলগুলি (মঙ্গো) কেবল ঝুলছিল এবং ব্রাউজারটি কেবলমাত্র আমাকে বলতে পারে 503 এবং তারপরে কিছু কর সম্পর্কিত নীরবতা। এই ত্রুটিটি সত্যই দীর্ঘকাল যাবত আমি বিভ্রান্ত হয়ে পড়েছিলাম app.use(cors());
alphanumeric0101

0

এখানে চিত্র বর্ণনা লিখুন

নীচের পদক্ষেপগুলি অনুসরণ করুন:

এনপিএম কর্স ইনস্টল করুন - সংরক্ষণ করুন

আপনার রুট জেএস ফাইলের ভিতরে:

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