নোডেজ এবং এক্সপ্রেস দিয়ে তৈরি একটি REST এপিআইতে প্রতিক্রিয়া স্থিতি এবং JSON সামগ্রী সেট করার উপযুক্ত উপায়


186

আমি নোডেজের সাথে ঘুরে বেড়াচ্ছি এবং একটি ছোট রেস্ট এপিআই তৈরি করে প্রকাশ করছি। আমার প্রশ্ন, কোডের স্থিতি নির্ধারণের ভাল অনুশীলন / সর্বোত্তম উপায় পাশাপাশি প্রতিক্রিয়া ডেটা কী?

আমাকে কিছুটা কোড দিয়ে ব্যাখ্যা করুন (সার্ভারটি শুরু করার জন্য প্রয়োজনীয় নোড এবং এক্সপ্রেস কোডটি আমি রাখব না, কেবল রাউটার পদ্ধতি যা সম্পর্কিত):

router.get('/users/:id', function(req, res, next) {
  var user = users.getUserById(req.params.id);
  res.json(user);
});


exports.getUserById = function(id) {
  for (var i = 0; i < users.length; i++) {
    if (users[i].id == id) return users[i];
  }
};

নীচের কোডটি পুরোপুরি কার্যকরভাবে কাজ করে এবং পোস্টম্যানের সাথে একটি অনুরোধ প্রেরণ করার সময় আমি নিম্নলিখিত ফলাফলটি পাই: এখানে চিত্র বর্ণনা লিখুন

আপনি দেখতে পাচ্ছেন, স্থিতিটি 200 দেখায় যা ঠিক আছে। তবে এটি কি এটি করার সর্বোত্তম উপায়? এমন কোনও মামলা আছে যেখানে আমার নিজেরও স্ট্যাটাসটি সেট করতে হবে, পাশাপাশি ফিরে আসা জেএসওনকেও রাখতে হবে? বা সবসময় এক্সপ্রেস দ্বারা পরিচালিত হয়?

উদাহরণস্বরূপ, আমি মাত্র একটি দ্রুত পরীক্ষা করেছি এবং উপরে প্রাপ্ত পদ্ধতিটি কিছুটা সংশোধন করেছি:

router.get('/users/:id', function(req, res, next) {
  var user = users.getUserById(req.params.id);
  if (user == null || user == 'undefined') {
    res.status(404);
  }
  res.json(user);
});

যেমন আপনি দেখতে পাচ্ছেন, যদি ব্যবহারকারী অ্যারেটিতে খুঁজে না পাওয়া যায় তবে আমি কেবল 404 এর স্থিতি সেট করব।

এই বিষয় সম্পর্কে আরও জানার জন্য সংস্থান / পরামর্শগুলি স্বাগত হওয়ার চেয়ে বেশি।


3
এটি আমার সর্বোচ্চ রেটিংযুক্ত উত্তর এবং এটি গৃহীত নয় :( @ অযোগ্য, আমি জানি কিছুক্ষণ হয়ে গেছে, তবে কী এটি আপনার সমস্যার সমাধান করেছে?
মাইচা দুদক

@ মিচা দুদক: হ্যাঁ, আপনার উত্তরটি গ্রহণযোগ্য হওয়া উচিত। তবে এই দুর্বল ব্যবহারকারীর অক্টোবর 15 2015 (জুলাই 31 2017 হিসাবে) থেকে সক্রিয় নেই। যাইহোক আপনার জবাবের জন্য +1;)
অমল এম কুলকার্নি

উত্তর:


228

এক্সপ্রেস এপিআই রেফারেন্স এই কেসটি কভার করে।

স্থিতি দেখুন এবং প্রেরণ করুন

সংক্ষেপে, ফোন করার statusআগে আপনাকে কেবল পদ্ধতিটি কল করতে হবে jsonবা send:

res.status(500).send({ error: "boo:(" });

32
আপনি শুধুমাত্র একটি স্থিতি কোড (কোন তথ্য) পাঠাতে চান, পদ্ধতি হবেres.sendStatus(400);
ইন্টারনেট নিকো

3
এটি আর কাজ করবে বলে মনে হয় না। প্রতিক্রিয়াটি সঠিক স্থিতির কোড সহ পাঠানো হয়েছে, তবে কোনও শরীর নেই ....
লন্ডনরব

2
আমার শেষ মন্তব্য উপেক্ষা করুন। আপনি যদি স্থিতিটি 204 এ সেট করেন (কোনও বিষয়বস্তু নেই) এটি শরীর পাঠায় না।
লন্ডনরব

2
@ ইন্টারনেট-নিকো res.sendStatus(400);একটি স্ট্রিং ডেটাও প্রেরণ করবে, সমানres.status(400).send('Not Found')
ডেভিড

74

আপনি এটি এইভাবে করতে পারেন:

res.status(400).json(json_response);

এটি এইচটিটিপি স্থিতির কোডটি 400 এ সেট করবে, এটি 4 এক্সপ্রেসেও কাজ করে।


17
express deprecated res.json(status, obj): Use res.status(status).json(obj) instead সুতরাং, res.status(400).json(json_response)আজকাল সঠিক হতে হবে।
উইল লুস

হ্যাঁ, ধন্যবাদ ... এটি অবচয় হিসাবে চিহ্নিত হয়েছে, তবে এখনও কাজ করে: পি আপনার মন্তব্যটি বৈধ, ভাল পয়েন্ট।
mzalazar

প্রতিশোধের পক্ষেres.status(500).send({ error: "boo:(" });
প্রার্থনা

41

200 অবস্থা ডিফল্ট যখন ব্যবহার করা হবে res.send, res.jsonইত্যাদি

আপনি স্ট্যাটাস সেট করতে পারেন res.status(500).json({ error: 'something is wrong' });

প্রায়শই আমি এমন কিছু করতাম ...

router.get('/something', function(req, res, next) {
  // Some stuff here
  if(err) {
    res.status(500);
    return next(err);
  }
  // More stuff here
});

তারপরে আমার ত্রুটি মিডলওয়্যারটি প্রতিক্রিয়াটি প্রেরণ করুন এবং যখন কোনও ত্রুটি আছে তখন আমার যা কিছু করা দরকার তা করুন।

অতিরিক্তভাবে: res.sendStatus(status)সংস্করণ 4.9.0 হিসাবে যুক্ত করা হয়েছে http://expressjs.com/4x/api.html#res.sendStatus


23

HTTP স্থিতি কোডগুলির একটি তালিকা

স্থিতির প্রতিক্রিয়া সম্পর্কিত ভাল-অনুশীলনটি অবশ্যই ত্রুটি (ক্লায়েন্ট ত্রুটির জন্য 4XX, সার্ভার ত্রুটির জন্য 5XX) এর উপর নির্ভর করে যথাযথ HTTP স্থিতি কোডটি প্রেরণ করা হয়, সত্যিকারের JSON প্রতিক্রিয়া সম্পর্কিত কোনও "বাইবেল" নেই তবে একটি ভাল ধারণা হতে পারে সফল প্রতিক্রিয়াতে মূল জিনিসটির 2 টি আলাদা আলাদা বৈশিষ্ট্য হিসাবে (আবার) স্থিতি এবং ডেটা প্রেরণ করা (আপনি ক্লায়েন্টকে এইচটিটিপি শিরোনাম এবং পেডলোড নিজেই স্ট্যাটাসটি ক্যাপচার করার সুযোগ দিচ্ছেন ) এবং একটি তৃতীয় সম্পত্তি যা ব্যাখ্যা করে ত্রুটির ক্ষেত্রে মানব-বোধগম্য ভাবে ত্রুটি।

স্ট্রাইপের এপিআই বাস্তব বিশ্বের মতো একই আচরণ করে।

অর্থাত

ঠিক আছে

200, {status: 200, data: [...]}

ত্রুটি

400, {status: 400, data: null, message: "You must send foo and bar to baz..."}

13

আমি এটি আমার এক্সপ্রেস.জেএস অ্যাপ্লিকেশনটিতে ব্যবহার করছি:

app.get('/', function (req, res) {
    res.status(200).json({
        message: 'Welcome to the project-name api'
    });
});

5

নিম্নলিখিত বৈশিষ্ট্যগুলি সহ সম্পূর্ণ এইচটিটিপিআরস্পোনস পাওয়ার স্ট্যান্ডার্ড উপায়

  1. বডি // আপনার ডেটা ধারণ করে
  2. হেডার
  3. ঠিক আছে
  4. অবস্থা
  5. statusText
  6. আদর্শ
  7. URL

উপর ব্যাকএন্ড , এই কাজ

router.post('/signup', (req, res, next) => {
    // res object have its own statusMessage property so utilize this
    res.statusText = 'Your have signed-up succesfully'
    return res.status(200).send('You are doing a great job')
})

উপর ফ্রন্টএন্ড যেমন মধ্যে Angularশুধু একটি করুন:

let url = `http://example.com/signup`
this.http.post(url, { profile: data }, {
    observe: 'response' // remember to add this, you'll get pure HttpResponse
}).subscribe(response => {
    console.log(response)
})




0

ত্রুটির প্রতিক্রিয়া প্রেরণের সর্বোত্তম উপায় হ'ল return res.status(400).send({ message: 'An error has occurred' })

তারপরে, আপনার সম্মুখভাগে আপনি এটির মতো কিছু ব্যবহার করে এটি ধরতে পারেন:

        url: your_url,
        method: 'POST',
        headers: headers,
        data: JSON.stringify(body),
    })
        .then((res) => {
            console.log('success', res);
        })
        .catch((err) => {
            err.response && err.response.data && this.setState({ apiResponse: err.response.data })
        })

errআপনার প্রেরিত বার্তাগুলি অবজেক্টটি যেমন প্রবেশ করায় কেবল লগিং কাজ করবে না err.response.data

আশা করি এইটি কাজ করবে!

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