নোড / এক্সপ্রেসে কীভাবে একটি কাস্টম http স্থিতি বার্তা প্রেরণ করবেন?


90

আমার নোড.জেএস অ্যাপ্লিকেশনটি এক্সপ্রেস / উদাহরণ / এমভিসি অ্যাপের মতো মডেল করা হয়েছে is

একটি নিয়ামক পদক্ষেপে আমি একটি কাস্টম http বার্তা দিয়ে একটি HTTP 400 স্থিতি আউট করতে চাই। ডিফল্টরূপে http স্থিতি বার্তাটি "খারাপ অনুরোধ":

HTTP/1.1 400 Bad Request

তবে আমি পাঠাতে চাই

HTTP/1.1 400 Current password does not match

আমি বিভিন্ন উপায়ে চেষ্টা করেছি কিন্তু তাদের মধ্যে কেউই আমার কাস্টম বার্তায় http স্থিতি বার্তা সেট করে নি।

আমার বর্তমান সমাধান কন্ট্রোলার ফাংশনটি দেখতে এমন দেখাচ্ছে:

exports.check = function( req, res) {
  if( req.param( 'val')!=='testme') {
    res.writeHead( 400, 'Current password does not match', {'content-type' : 'text/plain'});
    res.end( 'Current value does not match');

    return;
  } 
  // ...
}

সবকিছু ঠিকঠাক কাজ করে তবে ... এটি করার সঠিক উপায় বলে মনে হচ্ছে না।

এক্সপ্রেস ব্যবহার করে এইচটিপিএস স্থিতি বার্তা সেট করার আরও ভাল কোনও উপায় আছে কি?


4
ঠিক আছে, এটিই কেবল একমাত্র কাজ বলে মনে হচ্ছে। তবে আমি সে জাতীয় কোনও পরামর্শ দেব না, HTTP 1.1 স্পপের কিছু ত্রুটিযুক্ত কারণে এটির ত্রুটি বর্ণনাটি মানকযুক্ত করা হয়েছে। আমি মনে করি কাস্টম বর্ণনার সাথে সুপরিচিত স্ট্যাটাস-কোডগুলি প্রেরণ করা খারাপ অভ্যাস, তবে এটি আপনার পক্ষে।
schaermu

হুমম - সম্ভবত এটি সত্য। অন্যদিকে, আমি ব্রাউজারগুলি কেবল স্ট্যাটাস কোডটি যাচাই করে নেব এবং মানব পাঠযোগ্য HTTP স্থিতি বার্তাটি নয়। আমি ভেবেছিলাম এটি উপলভ্য হলে কংক্রিটের (যেমন ডিফল্ট নয়) ত্রুটি বার্তাটি পরিবহনের জন্য http স্থিতি বার্তাটি ব্যবহার করা ভাল ধারণা। এছাড়াও ক্লায়েন্ট সাইড জাভা স্ক্রিপ্ট ব্যবহার করে এটি দখল করা সহজ যে (jQuery ব্যবহার করে আপনি "jqXHR.statusText" করতে পারেন প্রদর্শনের উদ্দেশ্যে ত্রুটি পেতে)
লিগারম্যান

4
এটি সামঞ্জস্যতা বা সম্ভাব্য ব্রাউজার সম্পর্কিত বিষয় নয়, এটি কেবল খারাপ অভ্যাস;) যদি আপনি প্রদর্শনের জন্য কোনও ত্রুটি বার্তা চান তবে এটি শরীর হিসাবে পাঠান, এটিই উদ্দেশ্যযুক্ত উদ্দেশ্য।
schaermu

6
নির্দিষ্ট ত্রুটির বিবরণ অনুমানের অংশ নয়। আরসিএফ -২16১ specifically সুনির্দিষ্টভাবে বলেছে: "এইচটিটিপি / ১.১ এর জন্য সংজ্ঞায়িত সংখ্যাসূচক অবস্থানের কোডগুলির পৃথক মানসমূহ এবং সম্পর্কিত কারণ-বাক্যাংশের একটি উদাহরণ সেট নীচে উপস্থাপন করা হয়েছে here এখানে তালিকাভুক্ত কারণগুলির বাক্যগুলি কেবলমাত্র সুপারিশই রয়েছে - এগুলি পরিবর্তিত হতে পারে প্রোটোকলকে প্রভাবিত না করে স্থানীয় সমতুল্য ""
টেড বিঘাম

কাস্টম কারণ বাক্যাংশ দুর্দান্ত, কিন্তু (যেহেতু আপনার বার্তা "বর্তমান পাসওয়ার্ড মেলে না") মনে হচ্ছে আপনি আসলে এখানে কোড 401 চান, সেক্ষেত্রে আপনাকে সম্ভবত বার্তাটি পরিবর্তন করার দরকার নেই।
কোডব্লিং

উত্তর:


60

আপনি বিশদ বিবরণের জন্য এই res.send(400, 'Current password does not match') চেহারা এক্সপ্রেস 3.x ডক্স পরীক্ষা করতে পারেন

এক্সপ্রেস ৪.x এর জন্য আপডেট

এইভাবে ব্যবহার করুন ( এক্সপ্রেস 4.x ডক্স দেখুন ):

res.status(400).send('Current password does not match');
// or
res.status(400);
res.send('Current password does not match');

41
দুর্ভাগ্যক্রমে এটি http স্থিতি বার্তা সেট করবে না তবে দেহের সামগ্রী হিসাবে 'বর্তমানের পাসওয়ার্ড মেলে না' প্রেরণ করবে ...
লার্জসম্যান

এটি HTTP স্থিতি সেট করে, তবে একটি সতর্কতা নিক্ষেপ করে কারণ এই পদ্ধতির স্বাক্ষরটি হ্রাস করা হয়েছে।
nullability

4
res.status(400).send('Current password does not match');উদাহরণস্বরূপ এক্সপ্রেস 4. জন্য আমার জন্য কাজ করে
টিলার কলিয়ার

কাজ করেExpress ^4.16.2
অজয়

105

এক্সপি দ্বারা প্রেরিত ডিফল্ট কারণ-বাক্যাংশ (স্থিতির কোডের সাথে সাথেই প্রদর্শিত টেক্সট) ওভাররাইড করার জন্য ওপেনটি মূলত যা জিজ্ঞাসা করেছিল তা বিদ্যমান উত্তরগুলির মধ্যে কোনওটিই পূরণ করে না।

আপনি কি চান res.statusMessage। এটি এক্সপ্রেসের অংশ নয়, এটি নোড.জেএস ০.০১++ তে অন্তর্নিহিত http.Response অবজেক্টের সম্পত্তি।

আপনি এটির মতো এটি ব্যবহার করতে পারেন (এক্সপ্রেস 4.x এ পরীক্ষিত):

function(req, res) {
    res.statusMessage = "Current password does not match";
    res.status(400).end();
}

তারপরে curlএটি কার্যকর হয় তা যাচাই করতে ব্যবহার করুন :

$ curl -i -s http://localhost:3100/
HTTP/1.1 400 Current password does not match
X-Powered-By: Express
Date: Fri, 08 Apr 2016 19:04:35 GMT
Connection: keep-alive
Content-Length: 0

6
এটি statusMessageস্ট্যাটাস
কোডে

4
আপনি অন্তর্নিহিত বস্তুতে সম্পত্তিটি পেতে পারেনres.nativeResponse.statusMessage
sebilasse

@ রবার্টমস্কাল একটি সর্বনিম্ন এক্সপ্রেস সার্ভার (এক্সপ্রেস 4.16.1 এবং নোড 12.9.0) ব্যবহার করে পরীক্ষা করেছেন এবং এটি এখনও আমার পক্ষে কাজ করে। আপনার অ্যাপ্লিকেশন কোডটি পরীক্ষা করুন: সম্ভবত অন্য কিছু ভুল হয়েছে।
ম্যাকডন

নিশ্চিত না কেন এটি গৃহীত উত্তর নয় কেননা এটি অবশ্যই সমাধান হ'ল কমপক্ষে আমার লেখার সময়।
অ্যারন গ্রীষ্মে

4
এটি HTTP1.1 এর জন্য কাজ করা উচিত, HTTP2 নয়: nodejs.org/dist/latest-v15.x/docs/api/…
জোকসফার

12

সার্ভার সাইডে (এক্সপ্রেস মিডলওয়্যার):

if(err) return res.status(500).end('User already exists.');

ক্লায়েন্টের পাশে হ্যান্ডেল করুন

কৌণিক: -

$http().....
.error(function(data, status) {
  console.error('Repos error', status, data);//"Repos error" 500 "User already exists."
});

jQuery: -

$.ajax({
    type: "post",
    url: url,
    success: function (data, text) {
    },
    error: function (request, status, error) {
        alert(request.responseText);
    }
});

11

এক্সপ্রেসে এর মতো কাস্টম ত্রুটিগুলি হ্যান্ডেল করার একটি দুর্দান্ত উপায় হ'ল:

function errorHandler(err, req, res, next) {
  var code = err.code;
  var message = err.message;
  res.writeHead(code, message, {'content-type' : 'text/plain'});
  res.end(message);
}

(আপনি ব্যবহার প্রকাশ করতে পারেন 'বিল্ট-ইন express.errorHandler এই জন্য)

তারপরে আপনার মিডলওয়ারে, আপনার রুটের আগে:

app.use(errorHandler);

তারপরে আপনি যেখানে ত্রুটি তৈরি করতে চান 'বর্তমান পাসওয়ার্ড মেলে না':

function checkPassword(req, res, next) {
  // check password, fails:
  var err = new Error('Current password does not match');
  err.code = 400;
  // forward control on to the next registered error handler:
  return next(err);
}

err.status = 400; আমি বেশি বিশ্বাস করি।
এমকেমেলিন


3

আমার ব্যবহারের ক্ষেত্রে একটি কাস্টম JSON ত্রুটি বার্তা প্রেরণ করা হচ্ছে, যেহেতু আমি আমার REST এপিআই পাওয়ার জন্য এক্সপ্রেস ব্যবহার করছি। আমি মনে করি এটি মোটামুটি সাধারণ পরিস্থিতি, তাই আমার উত্তরে এটিতে মনোনিবেশ করা হবে।

সংক্ষিপ্ত সংস্করণ:

এক্সপ্রেস ত্রুটি পরিচালনা

তিনটির পরিবর্তে চারটি যুক্তি ব্যতীত অন্য মিডলওয়্যারের মতো ত্রুটি-পরিচালনা মিডলওয়্যারটিকে সংজ্ঞায়িত করুন, বিশেষত স্বাক্ষর সহ (এরর, রিক, রেস, পরবর্তী)। ... আপনি অন্যান্য অ্যাপ্লিকেশন (ইউএস) এবং রুটের কলগুলির পরে, ত্রুটি-পরিচালনা করে মিডলওয়্যারটিকে সর্বশেষে সংজ্ঞায়িত করেন

app.use(function(err, req, res, next) {
    if (err instanceof JSONError) {
      res.status(err.status).json({
        status: err.status,
        message: err.message
      });
    } else {
      next(err);
    }
  });

কোডের যে কোনও বিন্দু থেকে ত্রুটিগুলি উত্থাপন করুন:

var JSONError = require('./JSONError');
var err = new JSONError(404, 'Uh oh! Can't find something');
next(err);

দীর্ঘ সংস্করণ

ত্রুটি নিক্ষেপ করার প্রমিত উপায় হ'ল:

var err = new Error("Uh oh! Can't find something");
err.status = 404;
next(err)

ডিফল্টরূপে, এক্সপ্রেস এটিকে 402 কোড সহ একটি এইচটিটিপি রেসপন্স হিসাবে খুব সুন্দরভাবে প্যাকেজিংয়ের মাধ্যমে পরিচালনা করে এবং মেসেজের স্ট্রিংটি স্ট্যাক ট্রেসের সাহায্যে সংযুক্ত করে।

উদাহরণ হিসাবে উদাহরণস্বরূপ, যখন আমি এক্সপ্রেসটিকে একটি REST সার্ভার হিসাবে ব্যবহার করি তখন এটি আমার পক্ষে কার্যকর হয় না। আমি ত্রুটিটি এইচটিএমএল হিসাবে নয়, জেএসএন হিসাবে ফেরত পাঠাতে চাই। আমি অবশ্যই চাইব না যে আমার স্ট্যাকের ট্রেসটি আমার ক্লায়েন্টের দিকে চলে।

আমি প্রতিক্রিয়া হিসাবে JSON প্রেরণ করতে পারেন req.json(), উদাহরণস্বরূপ। মত কিছু req.json({ status: 404, message: 'Uh oh! Can't find something'})। Allyচ্ছিকভাবে, আমি ব্যবহার করে স্থিতি কোডটি সেট করতে পারি req.status()। দুটি সংমিশ্রণ:

req.status(404).json({ status: 404, message: 'Uh oh! Can't find something'});

এটি একটি কবজির মতো কাজ করে। এটি বলেছিল যে, আমার যতবার ত্রুটি হয়েছে ততবার টাইপ করা আমার পক্ষে যথেষ্ট অযৌক্তিক মনে হয় এবং কোডটি আর আমাদের মতো স্ব-ডকুমেন্টিং হয় না next(err)। এটি কোনও সাধারণ (যেমন, বৈধ) প্রতিক্রিয়া জেএসএনকে কীভাবে প্রেরণ করা হয়েছে তার থেকে অনেক বেশি মিল দেখায়। তদ্ব্যতীত, আধ্যাত্মিক পদ্ধতির দ্বারা নিক্ষিপ্ত যে কোনও ত্রুটি তার ফলস্বরূপ এইচটিএমএল আউটপুট দেয়।

এইখানেই মিডলওয়্যার পরিচালনা করতে এক্সপ্রেসের ত্রুটি আসে my আমার রুটের অংশ হিসাবে, আমি সংজ্ঞা দিই:

app.use(function(err, req, res, next) {
    console.log('Someone tried to throw an error response');
  });

আমি একটি কাস্টম JSONError ক্লাসে সাবক্লাস ত্রুটিও করেছি:

JSONError = function (status, message) {
    Error.prototype.constructor.call(this, status + ': ' + message);
    this.status = status;
    this.message = message;
  };
JSONError.prototype = Object.create(Error);
JSONError.prototype.constructor = JSONError;

এখন, আমি কোডটিতে একটি ত্রুটি ফেলতে চাইলে আমি এটি করি:

var err = new JSONError(404, 'Uh oh! Can't find something');
next(err);

মিডলওয়্যার পরিচালনা করার জন্য কাস্টম ত্রুটিতে ফিরে গিয়ে আমি এটিকে সংশোধন করি:

app.use(function(err, req, res, next) {
  if (err instanceof JSONError) {
    res.status(err.status).json({
      status: err.status,
      message: err.message
    });
  } else {
    next(err);
  }
}

JSONError এ সাবক্লাসিং ত্রুটিটি গুরুত্বপূর্ণ, কারণ আমার সন্দেহ হয় যে কোনও এক্সপ্রেস এক্সপ্লোরার instanceof Errorপ্রথম প্যারামিটারটিতে একটি চেক করে যা next()একটি সাধারণ হ্যান্ডলার বা ত্রুটি হ্যান্ডলারটি আবশ্যক কিনা তা নির্ধারণ করার জন্য এটি একটি পাস হয়েছে । instanceof JSONErrorঅপ্রত্যাশিত ত্রুটিগুলি (যেমন ক্রাশের মতো) এছাড়াও জেএসওএন প্রতিক্রিয়া ফিরিয়ে আনতে আমি চেকটি সরিয়ে ফেলতে এবং সামান্য পরিবর্তন করতে পারি।


3

অ্যাকজিওস ব্যবহার করার সময় আপনি এর সাথে কাস্টম প্রতিক্রিয়া বার্তাটি পুনরুদ্ধার করতে পারেন:

Axios.get(“your_url”)
.then(data => {
... do something
}.catch( err => {
console.log(err.response.data) // you want this
})

... এক্সপ্রেসে সেট করার পরে এটি:

res.status(400).send(“your custom message”)

এত সহজ, আপনার উপরের লোকেরা কেন জিনিসকে এত জটিল করে তুলতে হবে।
iqbal125

0

যদি আপনার লক্ষ্যটি কেবল একটি একক / সরল লাইনে হ্রাস করতে হয়, আপনি কিছুটা ডিফল্টের উপর নির্ভর করতে পারেন ...

return res.end(res.writeHead(400, 'Current password does not match'));

-2

রেজাইফাইয়ের ক্ষেত্রে আমাদের sendRaw()পদ্ধতিটি ব্যবহার করা উচিত

সিনট্যাক্সটি হ'ল: res.sendRaw(200, 'Operation was Successful', <some Header Data> or null)

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